From 5b4c7ddf7dbd99b8efc910323caa22ef4d038737 Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Thu, 23 May 2024 14:54:07 -0700 Subject: [PATCH] Don't scan+apply every setOldestVersion call --- Bench.cpp | 16 ++-------------- Facade.h | 22 +++++++++++++++++++--- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/Bench.cpp b/Bench.cpp index 49b11c0..e4ad408 100644 --- a/Bench.cpp +++ b/Bench.cpp @@ -3,11 +3,11 @@ #include void monotonicallyIncreasing() { - constexpr int kWindow = 100; + constexpr int kWindow = 1000; ankerl::nanobench::Bench bench; Facade facade{0}; - bench.minEpochIterations(1000); + bench.minEpochIterations(kWindow * 10); bench.warmup(kWindow).run("monotonically increasing", [&] { const int64_t remove = __builtin_bswap64(facade.getVersion() - kWindow); @@ -29,18 +29,6 @@ void monotonicallyIncreasing() { const auto end = facade.versioned.end(v); auto iter = begin; - bench.run("scan", [&] { - for (iter = begin; iter != end; ++iter) { - } - }); - - bench.run("reverse scan", [&] { - iter = end; - do { - --iter; - } while (iter != begin); - }); - bench.run("deref", [&] { bench.doNotOptimizeAway(*iter); }); iter = begin; diff --git a/Facade.h b/Facade.h index ffefbb3..4f8c719 100644 --- a/Facade.h +++ b/Facade.h @@ -12,7 +12,8 @@ using String = std::basic_string; struct Facade { explicit Facade(int64_t version) - : unversionedVersion(version), versioned{version} {} + : oldestVersion(version), nextPurgeVersion(version), + unversionedVersion(version), versioned(version) {} struct View { @@ -131,6 +132,15 @@ struct Facade { } void setOldestVersion(int64_t version) { + // Don't scan and apply mutations every time setOldestVersion is called. + + oldestVersion = version; + if (version >= nextPurgeVersion) { + nextPurgeVersion = versioned.getVersion(); + } else { + return; + } + for (auto iter = versioned.begin(version), end = versioned.end(version); iter != end; ++iter) { auto m = *iter; @@ -162,10 +172,14 @@ struct Facade { versioned.setOldestVersion(version); } - View viewAt(int64_t version) const { return View{this, version}; } + View viewAt(int64_t version) const { + assert(version >= oldestVersion); + assert(version <= versioned.getVersion()); + return View{this, version}; + } int64_t getVersion() const { return versioned.getVersion(); } - int64_t getOldestVersion() const { return versioned.getOldestVersion(); } + int64_t getOldestVersion() const { return oldestVersion; } void unversionedRead(const String &begin, const String &end, int &limit, bool reverse, @@ -197,6 +211,8 @@ struct Facade { } } + int64_t oldestVersion; + int64_t nextPurgeVersion; int64_t unversionedVersion; std::map unversioned; weaselab::VersionedMap versioned;