blob: 4f4165276d538b4ea48e36a8b2e48e1ce47e99ae [file] [log] [blame]
#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");
}
}