文档目录

一、自动生成测试用例

#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
# 负值表示时间减少了(变快了),所以这个优化是有效的