应使用 Google Benchmark 而非手写 std::chrono 循环,因其可防止编译器过度优化:需确保计算结果逃逸作用域,用 benchmark::DoNotOptimize() 包裹;避免在基准循环外构造大对象;利用 Range() 和 Args() 自动测试多规模输入。

直接用 Google Benchmark,别手写 std::chrono 循环——90% 的“性能变快了”其实是编译器把你的代码整个优化掉了,测的根本不是真实逻辑。
怎么写一个不被优化掉的测试函数
核心就两点:循环体里做计算,结果必须“逃逸”出作用域,否则 -O2 下连循环都可能消失。
- 用
benchmark::DoNotOptimize(x)包住你要测的计算结果(比如sum = a + b),这是最稳妥的做法 - 别在
for (auto _ : state)外构造/销毁大对象(如std::vector、std::string),否则初始化开销会混进测量值;真要预热,用state.PauseTiming()和state.ResumeTiming()隔离 - 返回值或打印不等于防优化——编译器知道你没用它,照样删;
DoNotOptimize是专门为此设计的屏障
怎么测不同输入规模下的性能
Range() 和 Args() 是关键,它们让 benchmark 自动跑多组参数并输出趋势,而不是你手动改数字再编译一次。
BENCHMARK(BM_memcpy)->Range(8, 8 表示从 8 字节到 8KB,按对数步进(即 8, 16, 32, …, 8192)各跑一遍-
state.range(0)在函数体内读取当前参数值,用于分配内存、控制循环次数等 - 想测两个变量组合?用
Ranges({{1,对应 <code>state.range(0)和state.range(1) - 记得调用
state.SetBytesProcessed(...),否则吞吐量(MB/s)指标不会显示
怎么确保结果可复现、不飘
同一段代码在不同时间跑出 2x 差距,大概率不是算法问题,而是环境干扰。
通过 SerpApi 查询 Google Flights,获取航班时刻表、价格及舱位等级信息。当用户询问航班 / 机票 / 航班价格、时刻表或对比信息时使用。
立即学习“C++免费学习笔记(深入)”;
- 必须用
Release模式编译(-O2或-O3),Debug下的性能毫无参考价值 - 运行时加
--benchmark_repetitions=3,框架会自动重复三次取中位数,过滤瞬时抖动 - CPU 频率和调度影响极大:Linux 下建议绑核(
taskset -c 0 ./bench)+ 关闭 intel_idle(echo 1 > /sys/devices/system/cpu/intel_idle/max_cstate)+ 禁用 turbo - 避免在虚拟机或容器里跑基准测试——CPU 共享、时钟虚拟化会让
real_time完全失真
怎么集成进日常开发流程
单次跑通不算结束,真正有价值的是把它变成能进 CI、能告警、能回归比对的环节。
- 输出 JSON:
--benchmark_format=json --benchmark_out=report.json,方便脚本解析 - 只跑特定测试:
--benchmark_filter=VectorPushBack或正则匹配(如.*Reserve.*) - 阈值检查:用 Python 脚本比对新旧
real_time,超 5% 就 fail CI;别依赖人工看数字 - 注意
BENCHMARK_MAIN()必须且只能出现一次,多个测试文件要统一链接,否则会报duplicate symbol
最容易被忽略的一点:所有测试必须在相同构建配置下运行——包括宏定义(如 DNDEBUG)、STL 实现(libstdc++ vs libc++)、甚至 glibc 版本。换一台机器重跑前,先确认 nm -D your_bench | grep benchmark 输出一致。

















