1a8c51b3fSopenharmony_ci#include <cstdlib> 2a8c51b3fSopenharmony_ci#include <map> 3a8c51b3fSopenharmony_ci 4a8c51b3fSopenharmony_ci#include "benchmark/benchmark.h" 5a8c51b3fSopenharmony_ci 6a8c51b3fSopenharmony_cinamespace { 7a8c51b3fSopenharmony_ci 8a8c51b3fSopenharmony_cistd::map<int, int> ConstructRandomMap(int size) { 9a8c51b3fSopenharmony_ci std::map<int, int> m; 10a8c51b3fSopenharmony_ci for (int i = 0; i < size; ++i) { 11a8c51b3fSopenharmony_ci m.insert(std::make_pair(std::rand() % size, std::rand() % size)); 12a8c51b3fSopenharmony_ci } 13a8c51b3fSopenharmony_ci return m; 14a8c51b3fSopenharmony_ci} 15a8c51b3fSopenharmony_ci 16a8c51b3fSopenharmony_ci} // namespace 17a8c51b3fSopenharmony_ci 18a8c51b3fSopenharmony_ci// Basic version. 19a8c51b3fSopenharmony_cistatic void BM_MapLookup(benchmark::State& state) { 20a8c51b3fSopenharmony_ci const int size = static_cast<int>(state.range(0)); 21a8c51b3fSopenharmony_ci std::map<int, int> m; 22a8c51b3fSopenharmony_ci for (auto _ : state) { 23a8c51b3fSopenharmony_ci state.PauseTiming(); 24a8c51b3fSopenharmony_ci m = ConstructRandomMap(size); 25a8c51b3fSopenharmony_ci state.ResumeTiming(); 26a8c51b3fSopenharmony_ci for (int i = 0; i < size; ++i) { 27a8c51b3fSopenharmony_ci auto it = m.find(std::rand() % size); 28a8c51b3fSopenharmony_ci benchmark::DoNotOptimize(it); 29a8c51b3fSopenharmony_ci } 30a8c51b3fSopenharmony_ci } 31a8c51b3fSopenharmony_ci state.SetItemsProcessed(state.iterations() * size); 32a8c51b3fSopenharmony_ci} 33a8c51b3fSopenharmony_ciBENCHMARK(BM_MapLookup)->Range(1 << 3, 1 << 12); 34a8c51b3fSopenharmony_ci 35a8c51b3fSopenharmony_ci// Using fixtures. 36a8c51b3fSopenharmony_ciclass MapFixture : public ::benchmark::Fixture { 37a8c51b3fSopenharmony_ci public: 38a8c51b3fSopenharmony_ci void SetUp(const ::benchmark::State& st) override { 39a8c51b3fSopenharmony_ci m = ConstructRandomMap(static_cast<int>(st.range(0))); 40a8c51b3fSopenharmony_ci } 41a8c51b3fSopenharmony_ci 42a8c51b3fSopenharmony_ci void TearDown(const ::benchmark::State&) override { m.clear(); } 43a8c51b3fSopenharmony_ci 44a8c51b3fSopenharmony_ci std::map<int, int> m; 45a8c51b3fSopenharmony_ci}; 46a8c51b3fSopenharmony_ci 47a8c51b3fSopenharmony_ciBENCHMARK_DEFINE_F(MapFixture, Lookup)(benchmark::State& state) { 48a8c51b3fSopenharmony_ci const int size = static_cast<int>(state.range(0)); 49a8c51b3fSopenharmony_ci for (auto _ : state) { 50a8c51b3fSopenharmony_ci for (int i = 0; i < size; ++i) { 51a8c51b3fSopenharmony_ci auto it = m.find(std::rand() % size); 52a8c51b3fSopenharmony_ci benchmark::DoNotOptimize(it); 53a8c51b3fSopenharmony_ci } 54a8c51b3fSopenharmony_ci } 55a8c51b3fSopenharmony_ci state.SetItemsProcessed(state.iterations() * size); 56a8c51b3fSopenharmony_ci} 57a8c51b3fSopenharmony_ciBENCHMARK_REGISTER_F(MapFixture, Lookup)->Range(1 << 3, 1 << 12); 58a8c51b3fSopenharmony_ci 59a8c51b3fSopenharmony_ciBENCHMARK_MAIN(); 60