// 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 #include #include #include #include "perfetto/base/flat_set.h" namespace { std::vector GetRandData(int num_pids) { std::vector 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(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 static void BM_SetInsert(benchmark::State& state) { std::vector rnd_data = GetRandData(static_cast(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)->Apply(BenchmarkArgs); BENCHMARK_TEMPLATE(BM_SetInsert, std::set)->Apply(BenchmarkArgs); BENCHMARK_TEMPLATE(BM_SetInsert, std::unordered_set)->Apply(BenchmarkArgs);