This repository has been archived on 2026-04-17. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
bhlib/bench/tests/BenchHashmap.c

137 lines
2.4 KiB
C
Raw Permalink Normal View History

#include <BH/Bench.h>
#include <BH/Hashmap.h>
#include <stdio.h>
#define NUM_ENTRIES 1000
static int keys[NUM_ENTRIES];
static char values[NUM_ENTRIES][16];
static BH_Hashmap *map;
static BH_Hashmap *warmMap;
int BH_IntEqual(const void *a, const void *b)
{
return (*(const int*)a == *(const int*)b) ? 0 : 1;
}
size_t BH_IntHash(const void *key)
{
int k = *(const int*)key;
return (size_t)((k * 2654435761U) >> 8);
}
static void setupData(void)
{
int i;
for (i = 0; i < NUM_ENTRIES; ++i)
{
keys[i] = i + 1;
sprintf(values[i], "value_%d", i + 1);
}
}
static void setupWarmMap(void)
{
int i;
warmMap = BH_HashmapNew(BH_IntEqual, BH_IntHash);
for (i = 0; i < NUM_ENTRIES; ++i)
{
BH_HashmapInsert(warmMap, &keys[i], values[i]);
}
}
BH_BENCH_TEST(NewFree)
{
while (BH_BenchIter(state))
{
map = BH_HashmapNew(BH_IntEqual, BH_IntHash);
BH_BenchDoNotOptimize(map);
BH_HashmapFree(map);
}
}
BH_BENCH_TEST(ReserveInsert)
{
BH_BenchSubcount(state, NUM_ENTRIES);
while (BH_BenchIter(state))
{
map = BH_HashmapNew(BH_IntEqual, BH_IntHash);
BH_HashmapReserve(map, NUM_ENTRIES);
for (int i = 0; i < NUM_ENTRIES; ++i)
{
BH_HashmapInsert(map, &keys[i], values[i]);
}
BH_HashmapClear(map);
BH_BenchDoNotOptimize(map);
BH_HashmapFree(map);
}
}
BH_BENCH_TEST(Lookup)
{
BH_BenchSubcount(state, NUM_ENTRIES);
while (BH_BenchIter(state))
{
int i;
void *value = NULL;
for (i = 0; i < NUM_ENTRIES; ++i)
{
BH_HashmapAt(warmMap, &keys[i], &value);
}
BH_BenchDoNotOptimize(value);
}
}
BH_BENCH_TEST(Remove)
{
BH_BenchSubcount(state, NUM_ENTRIES);
while (BH_BenchIter(state))
{
int i;
map = BH_HashmapNew(BH_IntEqual, BH_IntHash);
for (i = 0; i < NUM_ENTRIES; ++i)
{
BH_HashmapInsert(map, &keys[i], values[i]);
}
for (i = 0; i < NUM_ENTRIES; ++i)
{
BH_HashmapRemove(map, &keys[i]);
}
BH_BenchDoNotOptimize(map);
BH_HashmapFree(map);
}
}
int main(int argc, char **argv)
{
BH_UNUSED(argc);
BH_UNUSED(argv);
setupData();
setupWarmMap();
BH_BENCH_ADD(NewFree);
BH_BENCH_ADD(ReserveInsert);
BH_BENCH_ADD(Lookup);
BH_BENCH_ADD(Remove);
return BH_BenchRun();
}