| #include "../timing.h" |
| #include <compartment.h> |
| #include <debug.hh> |
| #include <locks.hh> |
| |
| using Debug = ConditionalDebug<DEBUG_ALLOCBENCH, "Allocator benchmark">; |
| |
| /** |
| * Try allocating 1 MiB of memory in allocation sizes ranging from 32 - 4096 |
| * bytes, report how long it takes. |
| */ |
| void __cheri_compartment("allocbench") run() |
| { |
| // Make sure sail doesn't print annoying log messages in the middle of the |
| // output the first time that allocation happens. |
| free(malloc(16)); |
| heap_quarantine_empty(); |
| printf("#board\tsize\ttime\n"); |
| const size_t MinimumSize = 32; |
| const size_t MaximumSize = 131072; |
| const size_t TotalSize = 1024 * 1024; |
| for (size_t size = MinimumSize; size <= MaximumSize; size <<= 1) |
| { |
| size_t allocations = TotalSize / size; |
| auto start = rdcycle(); |
| for (size_t i = 0; i < allocations; i++) |
| { |
| void *ptr = malloc(size); |
| Debug::Assert(ptr != nullptr, "Allocation {} of {} {}-byte allocations failed.", i, allocations, size); |
| free(ptr); |
| } |
| auto end = rdcycle(); |
| printf(__XSTRING(BOARD) "\t%ld\t%ld\n", static_cast<int>(size), end - start); |
| auto quota = heap_quota_remaining(MALLOC_CAPABILITY); |
| Debug::Invariant(quota == MALLOC_QUOTA, "Quota remaining {}, should be {}", quota, MALLOC_QUOTA); |
| Debug::log("Flushing quarantine"); |
| heap_quarantine_empty(); |
| Debug::log("Flushed quarantine"); |
| } |
| } |