| #include "test/jemalloc_test.h" |
| |
| static void |
| noop_alloc_hook(void *extra, hook_alloc_t type, void *result, |
| uintptr_t result_raw, uintptr_t args_raw[3]) { |
| } |
| |
| static void |
| noop_dalloc_hook(void *extra, hook_dalloc_t type, void *address, |
| uintptr_t args_raw[3]) { |
| } |
| |
| static void |
| noop_expand_hook(void *extra, hook_expand_t type, void *address, |
| size_t old_usize, size_t new_usize, uintptr_t result_raw, |
| uintptr_t args_raw[4]) { |
| } |
| |
| static void |
| malloc_free_loop(int iters) { |
| for (int i = 0; i < iters; i++) { |
| void *p = mallocx(1, 0); |
| free(p); |
| } |
| } |
| |
| static void |
| test_hooked(int iters) { |
| hooks_t hooks = {&noop_alloc_hook, &noop_dalloc_hook, &noop_expand_hook, |
| NULL}; |
| |
| int err; |
| void *handles[HOOK_MAX]; |
| size_t sz = sizeof(handles[0]); |
| |
| for (int i = 0; i < HOOK_MAX; i++) { |
| err = mallctl("experimental.hooks.install", &handles[i], |
| &sz, &hooks, sizeof(hooks)); |
| assert(err == 0); |
| |
| timedelta_t timer; |
| timer_start(&timer); |
| malloc_free_loop(iters); |
| timer_stop(&timer); |
| malloc_printf("With %d hook%s: %"FMTu64"us\n", i + 1, |
| i + 1 == 1 ? "" : "s", timer_usec(&timer)); |
| } |
| for (int i = 0; i < HOOK_MAX; i++) { |
| err = mallctl("experimental.hooks.remove", NULL, NULL, |
| &handles[i], sizeof(handles[i])); |
| assert(err == 0); |
| } |
| } |
| |
| static void |
| test_unhooked(int iters) { |
| timedelta_t timer; |
| timer_start(&timer); |
| malloc_free_loop(iters); |
| timer_stop(&timer); |
| |
| malloc_printf("Without hooks: %"FMTu64"us\n", timer_usec(&timer)); |
| } |
| |
| int |
| main(void) { |
| /* Initialize */ |
| free(mallocx(1, 0)); |
| int iters = 10 * 1000 * 1000; |
| malloc_printf("Benchmarking hooks with %d iterations:\n", iters); |
| test_hooked(iters); |
| test_unhooked(iters); |
| } |