| // Copyright (C) 2019 The Android Open Source Project |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #include <random> |
| #include <set> |
| #include <unordered_set> |
| |
| #include <benchmark/benchmark.h> |
| |
| #include "perfetto/base/flat_set.h" |
| |
| namespace { |
| |
| std::vector<int> GetRandData(int num_pids) { |
| std::vector<int> rnd_data; |
| std::minstd_rand0 rng(0); |
| static constexpr int kDistinctValues = 100; |
| for (int i = 0; i < num_pids; i++) |
| rnd_data.push_back(static_cast<int>(rng()) % kDistinctValues); |
| return rnd_data; |
| } |
| |
| bool IsBenchmarkFunctionalOnly() { |
| return getenv("BENCHMARK_FUNCTIONAL_TEST_ONLY") != nullptr; |
| } |
| |
| void BenchmarkArgs(benchmark::internal::Benchmark* b) { |
| if (IsBenchmarkFunctionalOnly()) { |
| b->Arg(64); |
| } else { |
| b->RangeMultiplier(2)->Range(64, 4096); |
| } |
| } |
| |
| } // namespace |
| |
| template <typename SetType> |
| static void BM_SetInsert(benchmark::State& state) { |
| std::vector<int> rnd_data = GetRandData(static_cast<int>(state.range(0))); |
| for (auto _ : state) { |
| SetType iset; |
| for (const int val : rnd_data) |
| iset.insert(val); |
| benchmark::DoNotOptimize(iset); |
| benchmark::DoNotOptimize(iset.begin()); |
| benchmark::ClobberMemory(); |
| } |
| } |
| |
| using perfetto::base::FlatSet; |
| BENCHMARK_TEMPLATE(BM_SetInsert, FlatSet<int>)->Apply(BenchmarkArgs); |
| BENCHMARK_TEMPLATE(BM_SetInsert, std::set<int>)->Apply(BenchmarkArgs); |
| BENCHMARK_TEMPLATE(BM_SetInsert, std::unordered_set<int>)->Apply(BenchmarkArgs); |