From 1151d555415d86798d3749de096d1f2dedd6530c Mon Sep 17 00:00:00 2001 From: Chris Miles Date: Wed, 11 Jun 2025 18:37:02 -0500 Subject: [PATCH] One more --- common/data_bucket.cpp | 3 ++ zone/cli/benchmark_databuckets.cpp | 45 ++++++++++++++++++++++++------ 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/common/data_bucket.cpp b/common/data_bucket.cpp index 9735c8cee..166100549 100644 --- a/common/data_bucket.cpp +++ b/common/data_bucket.cpp @@ -309,6 +309,9 @@ DataBucketsRepository::DataBuckets DataBucket::GetData(const DataBucketKey &k_, return e; } } + + // if we can cache its assumed we didn't load this into the cache so we should not return a miss + return DataBucketsRepository::NewEntity(); // Not found in cache } // Fetch the value from the database diff --git a/zone/cli/benchmark_databuckets.cpp b/zone/cli/benchmark_databuckets.cpp index 383465713..eaa214af3 100644 --- a/zone/cli/benchmark_databuckets.cpp +++ b/zone/cli/benchmark_databuckets.cpp @@ -195,6 +195,25 @@ void RunBenchmarkCycle(uint64_t target_rows) std::cout << "āœ… Completed " << Strings::Commify(OPERATIONS_PER_TEST) << " cached reads in " << read_cached_time.count() << " seconds. (DataBucket::GetData)\n"; + // šŸ” **Measure Client-Scoped Cache Miss Performance (Skips DB via CanCache)** + auto read_client_cache_miss_start = std::chrono::high_resolution_clock::now(); + for (size_t i = 0; i < OPERATIONS_PER_TEST; ++i) { + // generate key that doesn't exist + std::string key = "nonexistent_key_" + std::to_string(i); + + DataBucketKey k{ + .key = key, + .character_id = 999999999, // use scoped value + }; + + DataBucket::GetData(k); + } + auto read_client_cache_miss_end = std::chrono::high_resolution_clock::now(); + std::chrono::duration read_client_cache_miss_time = read_client_cache_miss_end - read_client_cache_miss_start; + std::cout << "āœ… Completed " << Strings::Commify(OPERATIONS_PER_TEST) + << " scoped cache-miss reads (no DB) in " + << read_client_cache_miss_time.count() << " seconds. (Client Scoped, Cache Miss, No DB)\n"; + // šŸ” **Measure Non-Cached Read Performance (Direct Query)** auto read_uncached_start = std::chrono::high_resolution_clock::now(); for (size_t i = 0; i < OPERATIONS_PER_TEST; ++i) { @@ -262,16 +281,24 @@ void ZoneCLI::BenchmarkDatabuckets(int argc, char **argv, argh::parser &cmd, std LogSys.SetDatabase(&database)->LoadLogDatabaseSettings(); } - auto start_time = std::chrono::high_resolution_clock::now(); + LogSys.log_settings[Logs::MySQLQuery].log_to_console = 1; - std::vector benchmark_sizes = {10000, 100000, 1000000}; + // šŸ” **Measure Client-Scoped Cache Miss Performance (Skips DB via CanCache)** + auto read_client_cache_miss_start = std::chrono::high_resolution_clock::now(); + for (size_t i = 0; i < 5000; ++i) { + // generate key that doesn't exist + std::string key = "nonexistent_key_" + std::to_string(i); - for (auto size: benchmark_sizes) { - RunBenchmarkCycle(size); + DataBucketKey k{ + .key = key, + .character_id = 999999999, // use scoped value + }; + + DataBucket::GetData(k); } - - // šŸš€ **Total Benchmark Time** - auto end_time = std::chrono::high_resolution_clock::now(); - std::chrono::duration total_elapsed = end_time - start_time; - std::cout << "\nšŸš€ Total Benchmark Time: " << total_elapsed.count() << " seconds\n"; + auto read_client_cache_miss_end = std::chrono::high_resolution_clock::now(); + std::chrono::duration read_client_cache_miss_time = read_client_cache_miss_end - read_client_cache_miss_start; + std::cout << "āœ… Completed " << Strings::Commify(5000) + << " scoped cache-miss reads (no DB) in " + << read_client_cache_miss_time.count() << " seconds. (Client Scoped, Cache Miss, No DB)\n"; }