一、自动生成测试用例#
#include <benchmark/benchmark.h>
#include <vector>
#include <algorithm>
// 测试不同 N 下 vector 的插入性能
static void BM_Vector_PushBack(benchmark::State& state) {
for (auto _ : state) {
std::vector<int> v;
// state.range(0) 是传入的参数
for (int i = 0; i < state.range(0); i++) {
v.push_back(i);
}
benchmark::DoNotOptimize(v);
}
}
// 生成一系列参数:8, 16, 32, 64, 128, 256, 512, 1024
BENCHMARK(BM_Vector_PushBack)->RangeMultiplier(2)->Range(8, 8 << 7);
// 测试不同的 reserve 策略
static void BM_Vector_Reserve(benchmark::State& state) {
for (auto _ : state) {
std::vector<int> v;
v.reserve(state.range(0));
for (int i = 0; i < state.range(0); i++) {
v.push_back(i);
}
benchmark::DoNotOptimize(v);
}
}
BENCHMARK(BM_Vector_Reserve)->RangeMultiplier(2)->Range(8, 8 << 7);
// 对比两个版本的输出,可以看到 reserve 后的版本快多少
二、对比测试结果#
./bench
# 输出示例:
# -------------------------------------------------------------------------
# Benchmark Time CPU Iterations
# -------------------------------------------------------------------------
# BM_Vector_PushBack/8 23 ns 22 ns 31875984
# BM_Vector_PushBack/64 155 ns 155 ns 4514715
# BM_Vector_PushBack/512 1252 ns 1250 ns 560000
# BM_Vector_PushBack/4096 10123 ns 10120 ns 69173
# BM_Vector_PushBack/32768 101234 ns 101200 ns 6917
#
# BM_Vector_Reserve/8 12 ns 12 ns 58337169 ← 快了近一倍
# BM_Vector_Reserve/64 83 ns 83 ns 8435509
# BM_Vector_Reserve/512 551 ns 551 ns 1269806
# BM_Vector_Reserve/4096 4123 ns 4120 ns 169720
# BM_Vector_Reserve/32768 37893 ns 37890 ns 18475
# 结论:reserve 后 push_back 快约 2x(省掉了多次扩容 + 搬移)
三、用 compare.py 生成对比报告#
# 先编译优化前的版本
g++ -O2 -o bench_before bench.cpp -lbenchmark
./bench_before --benchmark_out=before.json --benchmark_out_format=json
# 修改代码做优化
# 再编译优化后的版本
g++ -O2 -o bench_after bench.cpp -lbenchmark
./bench_after --benchmark_out=after.json --benchmark_out_format=json
# 用 benchmark 自带的比较脚本生成报告
python3 /path/to/benchmark/tools/compare.py benchmarks before.json after.json
# 输出:
# Run on (8 X 2400 MHz CPU s)
# CPU Caches:
# L1 Data 32K (x4)
# L1 Instruction 32K (x4)
# L2 Unified 256K (x4)
# L3 Unified 8192K (x1)
# Loading benchmarks...
# Comparing before.json to after.json
# Benchmark Time CPU Time Old Time New CPU Old CPU New
# --------------------------------------------------------------------------------------------
# BM_Vector_PushBack/8 -0.4868 -0.4868 23 12 22 12
# BM_Vector_PushBack/64 -0.4623 -0.4623 155 83 155 83
# BM_Vector_PushBack/512 -0.5595 -0.5595 1252 551 1250 552
# 负值表示时间减少了(变快了),所以这个优化是有效的