From c11d60ba038b9c1d5ce8988e2d742c88299e059d Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 25 Jun 2026 13:15:27 +0200 Subject: [PATCH 01/12] benchmark loop --- CMakeLists.txt | 1 + benchmark/CMakeLists.txt | 18 ++++++++++++++ benchmark/benchmark.cpp | 51 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+) create mode 100644 benchmark/CMakeLists.txt create mode 100644 benchmark/benchmark.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 417d49f..cbb700b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,7 @@ add_subdirectory(main) add_subdirectory(LRU) add_subdirectory(LFU) add_subdirectory(perfect) +add_subdirectory(benchmark) include(CTest) diff --git a/benchmark/CMakeLists.txt b/benchmark/CMakeLists.txt new file mode 100644 index 0000000..953ba69 --- /dev/null +++ b/benchmark/CMakeLists.txt @@ -0,0 +1,18 @@ +add_executable(benchmark) +target_sources(benchmark + PRIVATE + benchmark.cpp +) + +target_compile_options(benchmark + PRIVATE + $<$:/W4 /WX> + $<$:-Wall -Wextra -Werror> +) + +target_link_libraries(benchmark + PRIVATE + LRU + LFU + perfect +) diff --git a/benchmark/benchmark.cpp b/benchmark/benchmark.cpp new file mode 100644 index 0000000..9185050 --- /dev/null +++ b/benchmark/benchmark.cpp @@ -0,0 +1,51 @@ +#include "LFU.hpp" +#include "LRU.hpp" +#include "perfect.hpp" +#include +#include +#include +#include +#include +#include +#include + +int slow_get_page(int key) { return key; } + +std::vector generate_rnd_keys(size_t n, size_t mod = 100) { + std::vector keys(n); + std::generate(keys.begin(), keys.end(), [&]() { return rand() % mod; }); + return keys; +} + +int main() { + size_t input_sz = 1'000'000; + std::vector keys = generate_rnd_keys(input_sz, 100); + + std::map> cache_sizes_vs_strategy_hits; + for (size_t cache_sz = 10; cache_sz < 101; cache_sz += 10) { + std::map cache_hits; + cache::perfect_t perfect_cache(cache_sz, keys); + cache::LRU_t lru{cache_sz}; + cache::LFU_t lfu{cache_sz}; + + for (const auto key : keys) { + if (perfect_cache.lookup_update(key, slow_get_page)) + cache_hits["perfect_cache"] += 1; + + if (lru.lookup_update(key, slow_get_page)) + cache_hits["LRU"] += 1; + + if (lfu.lookup_update(key, slow_get_page)) + cache_hits["LFU"] += 1; + } + cache_sizes_vs_strategy_hits[cache_sz] = cache_hits; + + std::cout << "Cache type\tN hits\n"; + for (auto [cache_type, nhits] : cache_hits) { + std::cout << cache_type << "\t" << nhits << std::endl; + } + + } + + return 0; +} From 43a62798fbdd4dd148feacf37748002b05318151 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 25 Jun 2026 14:05:57 +0200 Subject: [PATCH 02/12] statistics with gnuplot --- benchmark/benchmark.cpp | 26 ++++++++++++++++++++++---- benchmark/cache_hit_statistics.png | Bin 0 -> 22785 bytes benchmark/cache_hits.dat | 13 +++++++++++++ benchmark/script.gp | 11 +++++++++++ 4 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 benchmark/cache_hit_statistics.png create mode 100644 benchmark/cache_hits.dat create mode 100644 benchmark/script.gp diff --git a/benchmark/benchmark.cpp b/benchmark/benchmark.cpp index 9185050..bdb756d 100644 --- a/benchmark/benchmark.cpp +++ b/benchmark/benchmark.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -18,10 +19,12 @@ std::vector generate_rnd_keys(size_t n, size_t mod = 100) { } int main() { - size_t input_sz = 1'000'000; - std::vector keys = generate_rnd_keys(input_sz, 100); + size_t input_sz = 100'000; + size_t rnd_mod = 100; + std::vector keys = generate_rnd_keys(input_sz, rnd_mod); std::map> cache_sizes_vs_strategy_hits; + std::cout << "Cache type\tN hits\n"; for (size_t cache_sz = 10; cache_sz < 101; cache_sz += 10) { std::map cache_hits; cache::perfect_t perfect_cache(cache_sz, keys); @@ -40,11 +43,26 @@ int main() { } cache_sizes_vs_strategy_hits[cache_sz] = cache_hits; - std::cout << "Cache type\tN hits\n"; + std::cout << "cache size: " << cache_sz << '\n'; for (auto [cache_type, nhits] : cache_hits) { - std::cout << cache_type << "\t" << nhits << std::endl; + std::cout << cache_type << "\t" << nhits << '\n'; } + std::cout << std::endl; + } + // output to a file + std::ofstream file("benchmark/cache_hits.dat"); + if (file.is_open()) { + file << "#Number of keys = " << input_sz << "\n" ; + file << "#input keys: uniform distribution [0:" << rnd_mod << ")\n" ; + file << "#Cache_size\tLRU\tLFU\tBelady\n"; + for(auto &[sz, cache_stats]: cache_sizes_vs_strategy_hits){ + file << sz <<'\t' + << cache_stats["LRU"] << '\t' + << cache_stats["LFU"] << '\t' + << cache_stats["perfect_cache"] << '\n'; + } + file.close(); } return 0; diff --git a/benchmark/cache_hit_statistics.png b/benchmark/cache_hit_statistics.png new file mode 100644 index 0000000000000000000000000000000000000000..fead7ddd6180c82284009af43327d7d0326a4b24 GIT binary patch literal 22785 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%0A0&zH95 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К-u5kuk4Exl>Z7pdOd(j_`0skyLGC3wJU;r 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 GU;PKBFQ>Ht literal 0 HcmV?d00001 diff --git a/benchmark/cache_hits.dat b/benchmark/cache_hits.dat new file mode 100644 index 0000000..f601acc --- /dev/null +++ b/benchmark/cache_hits.dat @@ -0,0 +1,13 @@ +#Number of keys = 100000 +#input keys: uniform distribution [0:100) +#Cache_size LRU LFU Belady +10 10015 9828 35205 +20 19947 19849 51756 +30 29887 29907 63218 +40 39921 39898 72054 +50 49944 49914 79207 +60 59924 59805 85109 +70 69960 69747 90046 +80 79974 79703 94157 +90 89939 89828 97468 +100 99900 99900 99900 diff --git a/benchmark/script.gp b/benchmark/script.gp new file mode 100644 index 0000000..ae1645a --- /dev/null +++ b/benchmark/script.gp @@ -0,0 +1,11 @@ +set terminal pngcairo size 800,600 enhanced font "Helvetica,12" +set output 'cache_hit_statistics.png' + +set title "Cache statistics for uniform random integers [0:100)" +set xlabel "Cache size" +set ylabel "Cache hits" +set key bottom right + +plot "cache_hits.dat" u 1:2 title "LRU",\ + "" u 1:3 title "LFU",\ + "" u 1:4 title "Belady"\ From 4900719714de0ae7bacab30c262264f00a81a803 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 25 Jun 2026 14:08:58 +0200 Subject: [PATCH 03/12] picture to readme --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 48cdd45..82d6a45 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,12 @@ LRU 3 LFU 1 ``` +### Benchmark +input : uniform random integers [0: 100) with input size 100'000 + +![statistics](./benchmark/cache_hit_statistics.png) + + # Tips From 5156d90b16c8bf645792da7e600b8b9239352251 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 25 Jun 2026 14:16:35 +0200 Subject: [PATCH 04/12] improvig readme --- README.md | 14 +++++++++----- benchmark/benchmark.cpp | 4 ++-- main/main.cpp | 2 +- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 82d6a45..1f03ada 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ How to run output is ```bash Cache type N hits +Belady 3 LRU 3 LFU 1 ``` @@ -17,14 +18,17 @@ input : uniform random integers [0: 100) with input size 100'000 ![statistics](./benchmark/cache_hit_statistics.png) +To reproduce benchmarks one needs to build the project and run +```bash +./build/benchmark/benchmark +cd benchmark +gnuplot script.gp +open cache_hit_statistics.png +``` -# Tips - -## CMAKE - - +## How to build: CMAKE ```bash cmake -S . -B build -G Ninja \ -DCMAKE_C_COMPILER=gcc-14 \ diff --git a/benchmark/benchmark.cpp b/benchmark/benchmark.cpp index bdb756d..7ef9707 100644 --- a/benchmark/benchmark.cpp +++ b/benchmark/benchmark.cpp @@ -33,7 +33,7 @@ int main() { for (const auto key : keys) { if (perfect_cache.lookup_update(key, slow_get_page)) - cache_hits["perfect_cache"] += 1; + cache_hits["Belady"] += 1; if (lru.lookup_update(key, slow_get_page)) cache_hits["LRU"] += 1; @@ -60,7 +60,7 @@ int main() { file << sz <<'\t' << cache_stats["LRU"] << '\t' << cache_stats["LFU"] << '\t' - << cache_stats["perfect_cache"] << '\n'; + << cache_stats["Belady"] << '\n'; } file.close(); } diff --git a/main/main.cpp b/main/main.cpp index 5400a7a..3bf01f5 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -27,7 +27,7 @@ int main() { std::map cache_hits; for (const auto key : keys) { if (perfect_cache.lookup_update(key, slow_get_page)) - cache_hits["perfect_cache"] += 1; + cache_hits["Belady"] += 1; if (lru.lookup_update(key, slow_get_page)) cache_hits["LRU"] += 1; From 0fdec937944752652740a7011b531f1db9bb24a1 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 25 Jun 2026 14:24:32 +0200 Subject: [PATCH 05/12] improve readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1f03ada..5ca4f7a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# cpp_proj +# HWC Caches. LRU, LFU, Belady's optimal cache -How to run +## How to run ```bash ./build/main/main <<< "2 6 3 3 1 2 1 2" # cache_size Nelem elem1 elem2 ... From 8dae6dda25beb7ce33c26434bb5131f496c8d769 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 25 Jun 2026 14:36:38 +0200 Subject: [PATCH 06/12] int to sizet for rnd --- benchmark/benchmark.cpp | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/benchmark/benchmark.cpp b/benchmark/benchmark.cpp index 7ef9707..76989d7 100644 --- a/benchmark/benchmark.cpp +++ b/benchmark/benchmark.cpp @@ -14,7 +14,8 @@ int slow_get_page(int key) { return key; } std::vector generate_rnd_keys(size_t n, size_t mod = 100) { std::vector keys(n); - std::generate(keys.begin(), keys.end(), [&]() { return rand() % mod; }); + std::generate(keys.begin(), keys.end(), + [&]() { return static_cast(rand() % mod); }); return keys; } @@ -23,7 +24,7 @@ int main() { size_t rnd_mod = 100; std::vector keys = generate_rnd_keys(input_sz, rnd_mod); - std::map> cache_sizes_vs_strategy_hits; + std::map> cache_sizes_vs_strategy_hits; std::cout << "Cache type\tN hits\n"; for (size_t cache_sz = 10; cache_sz < 101; cache_sz += 10) { std::map cache_hits; @@ -43,7 +44,7 @@ int main() { } cache_sizes_vs_strategy_hits[cache_sz] = cache_hits; - std::cout << "cache size: " << cache_sz << '\n'; + std::cout << "cache size: " << cache_sz << '\n'; for (auto [cache_type, nhits] : cache_hits) { std::cout << cache_type << "\t" << nhits << '\n'; } @@ -53,14 +54,12 @@ int main() { // output to a file std::ofstream file("benchmark/cache_hits.dat"); if (file.is_open()) { - file << "#Number of keys = " << input_sz << "\n" ; - file << "#input keys: uniform distribution [0:" << rnd_mod << ")\n" ; + file << "#Number of keys = " << input_sz << "\n"; + file << "#input keys: uniform distribution [0:" << rnd_mod << ")\n"; file << "#Cache_size\tLRU\tLFU\tBelady\n"; - for(auto &[sz, cache_stats]: cache_sizes_vs_strategy_hits){ - file << sz <<'\t' - << cache_stats["LRU"] << '\t' - << cache_stats["LFU"] << '\t' - << cache_stats["Belady"] << '\n'; + for (auto &[sz, cache_stats] : cache_sizes_vs_strategy_hits) { + file << sz << '\t' << cache_stats["LRU"] << '\t' << cache_stats["LFU"] + << '\t' << cache_stats["Belady"] << '\n'; } file.close(); } From 51b62c1349c4cef0ac6807afc21e7fd46a9e0e5b Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 25 Jun 2026 14:37:57 +0200 Subject: [PATCH 07/12] sizet to int for rnd --- benchmark/benchmark.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmark/benchmark.cpp b/benchmark/benchmark.cpp index 76989d7..78d261f 100644 --- a/benchmark/benchmark.cpp +++ b/benchmark/benchmark.cpp @@ -15,7 +15,7 @@ int slow_get_page(int key) { return key; } std::vector generate_rnd_keys(size_t n, size_t mod = 100) { std::vector keys(n); std::generate(keys.begin(), keys.end(), - [&]() { return static_cast(rand() % mod); }); + [&]() { return static_cast(rand() % mod); }); return keys; } From 1a76a7e2b8c87f71cd81d67c03195093c3d8cad1 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 25 Jun 2026 14:41:00 +0200 Subject: [PATCH 08/12] remove size_t --- benchmark/benchmark.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/benchmark/benchmark.cpp b/benchmark/benchmark.cpp index 78d261f..7af0661 100644 --- a/benchmark/benchmark.cpp +++ b/benchmark/benchmark.cpp @@ -12,7 +12,7 @@ int slow_get_page(int key) { return key; } -std::vector generate_rnd_keys(size_t n, size_t mod = 100) { +std::vector generate_rnd_keys(size_t n, int mod = 100) { std::vector keys(n); std::generate(keys.begin(), keys.end(), [&]() { return static_cast(rand() % mod); }); @@ -24,9 +24,9 @@ int main() { size_t rnd_mod = 100; std::vector keys = generate_rnd_keys(input_sz, rnd_mod); - std::map> cache_sizes_vs_strategy_hits; + std::map> cache_sizes_vs_strategy_hits; std::cout << "Cache type\tN hits\n"; - for (size_t cache_sz = 10; cache_sz < 101; cache_sz += 10) { + for (int cache_sz = 10; cache_sz < 101; cache_sz += 10) { std::map cache_hits; cache::perfect_t perfect_cache(cache_sz, keys); cache::LRU_t lru{cache_sz}; From 0b2860f714778280db64ef472b2d24c1d770f86d Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 25 Jun 2026 14:43:34 +0200 Subject: [PATCH 09/12] cace size is size_t --- benchmark/benchmark.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/benchmark/benchmark.cpp b/benchmark/benchmark.cpp index 7af0661..480a9e1 100644 --- a/benchmark/benchmark.cpp +++ b/benchmark/benchmark.cpp @@ -24,9 +24,9 @@ int main() { size_t rnd_mod = 100; std::vector keys = generate_rnd_keys(input_sz, rnd_mod); - std::map> cache_sizes_vs_strategy_hits; + std::map> cache_sizes_vs_strategy_hits; std::cout << "Cache type\tN hits\n"; - for (int cache_sz = 10; cache_sz < 101; cache_sz += 10) { + for (size_t cache_sz = 10; cache_sz < 101; cache_sz += 10) { std::map cache_hits; cache::perfect_t perfect_cache(cache_sz, keys); cache::LRU_t lru{cache_sz}; From f7fe863e8d78bf97f127d7a603774b1f82121466 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 25 Jun 2026 14:45:50 +0200 Subject: [PATCH 10/12] release flag in CI/CD --- .github/workflows/cmake-multi-platform.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cmake-multi-platform.yml b/.github/workflows/cmake-multi-platform.yml index 42c677e..d2840a2 100644 --- a/.github/workflows/cmake-multi-platform.yml +++ b/.github/workflows/cmake-multi-platform.yml @@ -24,7 +24,7 @@ jobs: # To add more build types (Release, Debug, RelWithDebInfo, etc.) customize the build_type list. matrix: os: [ubuntu-latest, windows-latest] - build_type: [Debug] + build_type: [Release] c_compiler: [gcc, clang, cl] include: - os: windows-latest From c335019599731de0a8760a3cd048bd0c7d06dd8c Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 25 Jun 2026 14:47:38 +0200 Subject: [PATCH 11/12] size_t problem in benchmark.cpp --- benchmark/benchmark.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmark/benchmark.cpp b/benchmark/benchmark.cpp index 480a9e1..ec258ab 100644 --- a/benchmark/benchmark.cpp +++ b/benchmark/benchmark.cpp @@ -21,7 +21,7 @@ std::vector generate_rnd_keys(size_t n, int mod = 100) { int main() { size_t input_sz = 100'000; - size_t rnd_mod = 100; + int rnd_mod = 100; std::vector keys = generate_rnd_keys(input_sz, rnd_mod); std::map> cache_sizes_vs_strategy_hits; From 163912fe86901dd585916c7726b5fee4bdb9f9a0 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 25 Jun 2026 14:50:50 +0200 Subject: [PATCH 12/12] rm unused var --- tests/LFU_test.cpp | 2 -- tests/LRU_test.cpp | 2 -- tests/perfect_test.cpp | 2 -- 3 files changed, 6 deletions(-) diff --git a/tests/LFU_test.cpp b/tests/LFU_test.cpp index 1e20f86..8d1d145 100644 --- a/tests/LFU_test.cpp +++ b/tests/LFU_test.cpp @@ -87,9 +87,7 @@ TEST(LFU, eviction_LRU) { size_t nhits(const std::vector &input) { size_t cache_sz = input[0]; - size_t nelem = input[1]; std::vector page_ids(input.begin() + 2, input.end()); - assert(page_ids.size() == nelem); cache::LFU_t lfu{cache_sz}; size_t hits{}; diff --git a/tests/LRU_test.cpp b/tests/LRU_test.cpp index 0d12d15..cdab383 100644 --- a/tests/LRU_test.cpp +++ b/tests/LRU_test.cpp @@ -67,9 +67,7 @@ TEST(LRU, eviction) { size_t nhits(const std::vector &input) { size_t cache_sz = input[0]; - size_t nelem = input[1]; std::vector page_ids(input.begin() + 2, input.end()); - assert(page_ids.size() == nelem); cache::LRU_t lru{cache_sz}; size_t hits{}; diff --git a/tests/perfect_test.cpp b/tests/perfect_test.cpp index 1304617..260d82a 100644 --- a/tests/perfect_test.cpp +++ b/tests/perfect_test.cpp @@ -86,9 +86,7 @@ TEST(Perfect_cache, eviction_2) { size_t nhits(const std::vector &input) { size_t cache_sz = input[0]; - size_t nelem = input[1]; std::vector page_ids(input.begin() + 2, input.end()); - assert(page_ids.size() == nelem); cache::perfect_t perf_cache{cache_sz, page_ids}; size_t hits{};