diff --git a/Bench.cpp b/Bench.cpp index 273ee15..8932fa5 100644 --- a/Bench.cpp +++ b/Bench.cpp @@ -1,4 +1,5 @@ #include "Facade.h" +#include "Internal.h" #include @@ -55,8 +56,49 @@ void monotonicallyIncreasing() { }); bench.run("end", [&] { facade.versioned.end(v); }); - - // TODO benchmark reads } -int main() { monotonicallyIncreasing(); } \ No newline at end of file +void bulkFirstGeq() { + constexpr int kNumKeys = 100000; + constexpr int kNumQueries = 100; + ankerl::nanobench::Bench bench; + bench.batch(kNumQueries); + + // Initialize `versionedMap` + weaselab::VersionedMap versionedMap{0}; + for (int64_t i = 0; i < kNumKeys; ++i) { + const auto bigEndian = __builtin_bswap64(i); + weaselab::VersionedMap::Mutation m; + m.param1 = (const uint8_t *)&bigEndian; + m.param1Len = sizeof(bigEndian); + m.param2 = (const uint8_t *)&bigEndian; + m.param2Len = sizeof(bigEndian); + m.type = weaselab::VersionedMap::Set; + versionedMap.addMutations(&m, 1, i + 1); + } + + // Prepare queries + Arena arena; + auto *keys = new (arena) weaselab::VersionedMap::Key[kNumQueries]; + auto *versions = new (arena) int64_t[kNumQueries]; + for (int64_t i = 0; i < kNumQueries; ++i) { + int64_t version = i * kNumKeys / kNumQueries; + versions[i] = version; + const auto bigEndian = __builtin_bswap64(version); + uint8_t *k = new (arena) uint8_t[sizeof(bigEndian)]; + memcpy(k, &bigEndian, sizeof(bigEndian)); + keys[i].p = k; + keys[i].len = sizeof(bigEndian); + } + + // Bench + bench.run("bulkFirstGeq", [&] { + weaselab::VersionedMap::Iterator iterators[kNumQueries]; + versionedMap.firstGeq(keys, versions, iterators, kNumQueries); + }); +} + +int main() { + monotonicallyIncreasing(); + bulkFirstGeq(); +} \ No newline at end of file