| #include "test/jemalloc_test.h" |
| #include "test/bench.h" |
| |
| #define SMALL_ALLOC_SIZE 128 |
| #define LARGE_ALLOC_SIZE SC_LARGE_MINCLASS |
| #define NALLOCS 1000 |
| |
| /* |
| * We make this volatile so the 1-at-a-time variants can't leave the allocation |
| * in a register, just to try to get the cache behavior closer. |
| */ |
| void *volatile allocs[NALLOCS]; |
| |
| static void |
| array_alloc_dalloc_small(void) { |
| for (int i = 0; i < NALLOCS; i++) { |
| void *p = mallocx(SMALL_ALLOC_SIZE, 0); |
| assert_ptr_not_null(p, "mallocx shouldn't fail"); |
| allocs[i] = p; |
| } |
| for (int i = 0; i < NALLOCS; i++) { |
| sdallocx(allocs[i], SMALL_ALLOC_SIZE, 0); |
| } |
| } |
| |
| static void |
| item_alloc_dalloc_small(void) { |
| for (int i = 0; i < NALLOCS; i++) { |
| void *p = mallocx(SMALL_ALLOC_SIZE, 0); |
| assert_ptr_not_null(p, "mallocx shouldn't fail"); |
| allocs[i] = p; |
| sdallocx(allocs[i], SMALL_ALLOC_SIZE, 0); |
| } |
| } |
| |
| TEST_BEGIN(test_array_vs_item_small) { |
| compare_funcs(1 * 1000, 10 * 1000, |
| "array of small allocations", array_alloc_dalloc_small, |
| "small item allocation", item_alloc_dalloc_small); |
| } |
| TEST_END |
| |
| static void |
| array_alloc_dalloc_large(void) { |
| for (int i = 0; i < NALLOCS; i++) { |
| void *p = mallocx(LARGE_ALLOC_SIZE, 0); |
| assert_ptr_not_null(p, "mallocx shouldn't fail"); |
| allocs[i] = p; |
| } |
| for (int i = 0; i < NALLOCS; i++) { |
| sdallocx(allocs[i], LARGE_ALLOC_SIZE, 0); |
| } |
| } |
| |
| static void |
| item_alloc_dalloc_large(void) { |
| for (int i = 0; i < NALLOCS; i++) { |
| void *p = mallocx(LARGE_ALLOC_SIZE, 0); |
| assert_ptr_not_null(p, "mallocx shouldn't fail"); |
| allocs[i] = p; |
| sdallocx(allocs[i], LARGE_ALLOC_SIZE, 0); |
| } |
| } |
| |
| TEST_BEGIN(test_array_vs_item_large) { |
| compare_funcs(100, 1000, |
| "array of large allocations", array_alloc_dalloc_large, |
| "large item allocation", item_alloc_dalloc_large); |
| } |
| TEST_END |
| |
| int main(void) { |
| return test_no_reentrancy( |
| test_array_vs_item_small, |
| test_array_vs_item_large); |
| } |