blob: 65a520325da56004e49d1e658afb8ac92331788e [file] [log] [blame]
// 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);