I've put some work into the Google Benchmark library in order to make it easier to benchmark libc++. These changes have already been upstreamed into Google Benchmark and this patch applies the changes to the in-tree version. The main improvement in the addition of a 'compare_bench.py' script which makes it very easy to compare benchmarks. For example to compare the native STL to libc++ you would run: `$ compare_bench.py ./util_smartptr.native.out ./util_smartptr.libcxx.out` And the output would look like: RUNNING: ./util_smartptr.native.out Benchmark Time CPU Iterations ---------------------------------------------------------------- BM_SharedPtrCreateDestroy 62 ns 62 ns 10937500 BM_SharedPtrIncDecRef 31 ns 31 ns 23972603 BM_WeakPtrIncDecRef 28 ns 28 ns 23648649 RUNNING: ./util_smartptr.libcxx.out Benchmark Time CPU Iterations ---------------------------------------------------------------- BM_SharedPtrCreateDestroy 46 ns 46 ns 14957265 BM_SharedPtrIncDecRef 31 ns 31 ns 22435897 BM_WeakPtrIncDecRef 34 ns 34 ns 21084337 Comparing ./util_smartptr.native.out to ./util_smartptr.libcxx.out Benchmark Time CPU ----------------------------------------------------- BM_SharedPtrCreateDestroy -0.26 -0.26 BM_SharedPtrIncDecRef +0.00 +0.00 BM_WeakPtrIncDecRef +0.21 +0.21 git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@278147 91177308-0d34-0410-b5e6-96231b3b80d8
59 lines
1.3 KiB
C++
59 lines
1.3 KiB
C++
#include "benchmark/benchmark.h"
|
|
|
|
#include <cstdlib>
|
|
#include <map>
|
|
|
|
namespace {
|
|
|
|
std::map<int, int> ConstructRandomMap(int size) {
|
|
std::map<int, int> m;
|
|
for (int i = 0; i < size; ++i) {
|
|
m.insert(std::make_pair(rand() % size, rand() % size));
|
|
}
|
|
return m;
|
|
}
|
|
|
|
} // namespace
|
|
|
|
// Basic version.
|
|
static void BM_MapLookup(benchmark::State& state) {
|
|
const int size = state.range(0);
|
|
while (state.KeepRunning()) {
|
|
state.PauseTiming();
|
|
std::map<int, int> m = ConstructRandomMap(size);
|
|
state.ResumeTiming();
|
|
for (int i = 0; i < size; ++i) {
|
|
benchmark::DoNotOptimize(m.find(rand() % size));
|
|
}
|
|
}
|
|
state.SetItemsProcessed(state.iterations() * size);
|
|
}
|
|
BENCHMARK(BM_MapLookup)->Range(1 << 3, 1 << 12);
|
|
|
|
// Using fixtures.
|
|
class MapFixture : public ::benchmark::Fixture {
|
|
public:
|
|
void SetUp(const ::benchmark::State& st) {
|
|
m = ConstructRandomMap(st.range(0));
|
|
}
|
|
|
|
void TearDown(const ::benchmark::State&) {
|
|
m.clear();
|
|
}
|
|
|
|
std::map<int, int> m;
|
|
};
|
|
|
|
BENCHMARK_DEFINE_F(MapFixture, Lookup)(benchmark::State& state) {
|
|
const int size = state.range(0);
|
|
while (state.KeepRunning()) {
|
|
for (int i = 0; i < size; ++i) {
|
|
benchmark::DoNotOptimize(m.find(rand() % size));
|
|
}
|
|
}
|
|
state.SetItemsProcessed(state.iterations() * size);
|
|
}
|
|
BENCHMARK_REGISTER_F(MapFixture, Lookup)->Range(1<<3, 1<<12);
|
|
|
|
BENCHMARK_MAIN()
|