From a24d80467a825a6126e94186cdcd86a3fdd29f55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Wo=CC=81jcik?= <3044353+pwojcikdev@users.noreply.github.com> Date: Wed, 3 Jul 2024 17:33:25 +0200 Subject: [PATCH] Store & ledger benchmarks --- nano/benchmarks/CMakeLists.txt | 2 +- nano/benchmarks/ledger.cpp | 101 +++++++++++++++++++++++++++ nano/secure/generate_cache_flags.hpp | 12 ++++ 3 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 nano/benchmarks/ledger.cpp diff --git a/nano/benchmarks/CMakeLists.txt b/nano/benchmarks/CMakeLists.txt index dc382930..94a3e64f 100644 --- a/nano/benchmarks/CMakeLists.txt +++ b/nano/benchmarks/CMakeLists.txt @@ -1,4 +1,4 @@ -add_executable(benchmarks entry.cpp stats.cpp) +add_executable(benchmarks entry.cpp ledger.cpp stats.cpp) target_link_libraries(benchmarks test_common benchmark::benchmark) diff --git a/nano/benchmarks/ledger.cpp b/nano/benchmarks/ledger.cpp new file mode 100644 index 00000000..52d2c87e --- /dev/null +++ b/nano/benchmarks/ledger.cpp @@ -0,0 +1,101 @@ +#include +#include +#include +#include +#include +#include +#include + +#include + +// Expects live ledger in default location +// PLEASE NOTE: Make sure to purge disk cache between runs (`purge` command on macOS) +static void BM_ledger_iterate_accounts (benchmark::State & state) +{ + nano::logger logger; + nano::stats stats{ logger }; + + // Use live ledger + nano::networks network = nano::networks::nano_live_network; + nano::network_params network_params{ network }; + auto application_path = nano::working_path (network); + + auto store_impl{ nano::make_store (logger, application_path, network_params.ledger) }; + auto & store{ *store_impl }; + + if (store.init_error ()) + { + state.SkipWithError ("Store initialization failed. Make sure ledger files are present in the default location."); + } + + auto ledger_impl{ std::make_unique (store, network_params.ledger, stats, logger, nano::generate_cache_flags::all_disabled ()) }; + auto & ledger{ *ledger_impl }; + + auto transaction = ledger.tx_begin_read (); + nano::account current{ 0 }; + nano::account_info current_info; + auto it = ledger.any.account_begin (transaction); + auto end = ledger.any.account_end (); + for (auto _ : state) + { + if (it != end) + { + current = it->first; + current_info = it->second; + benchmark::DoNotOptimize (current); + benchmark::DoNotOptimize (current_info); + + ++it; + } + else + { + break; + } + } +} +BENCHMARK (BM_ledger_iterate_accounts); + +// Expects live ledger in default location +// PLEASE NOTE: Make sure to purge disk cache between runs (`purge` command on macOS) +static void BM_store_iterate_accounts (benchmark::State & state) +{ + nano::logger logger; + nano::stats stats{ logger }; + + // Use live ledger + nano::networks network = nano::networks::nano_live_network; + nano::network_params network_params{ network }; + nano::node_flags flags; + auto application_path = nano::working_path (network); + + auto store_impl{ nano::make_store (logger, application_path, network_params.ledger) }; + auto & store{ *store_impl }; + + if (store.init_error ()) + { + state.SkipWithError ("Store initialization failed. Make sure ledger files are present in the default location."); + } + + auto transaction = store.tx_begin_read (); + nano::account current{ 0 }; + nano::account_info current_info; + auto it = store.account.begin (transaction); + auto end = store.account.end (transaction); + for (auto _ : state) + { + if (it != end) + { + current = it->first; + current_info = it->second; + benchmark::DoNotOptimize (current); + benchmark::DoNotOptimize (current_info); + + ++it; + } + else + { + break; + } + } +} +BENCHMARK (BM_store_iterate_accounts); \ No newline at end of file diff --git a/nano/secure/generate_cache_flags.hpp b/nano/secure/generate_cache_flags.hpp index 29445e53..f3d832d7 100644 --- a/nano/secure/generate_cache_flags.hpp +++ b/nano/secure/generate_cache_flags.hpp @@ -14,5 +14,17 @@ public: bool block_count = true; void enable_all (); + +public: + static generate_cache_flags all_disabled () + { + generate_cache_flags flags; + flags.reps = false; + flags.cemented_count = false; + flags.unchecked_count = false; + flags.account_count = false; + flags.block_count = false; + return flags; + } }; }