Google Benchmark性能计数器结果后n、p、u字母含义咨询
关于Google Benchmark性能计数器后缀字母的含义
问题背景
用户编写了如下Google Benchmark基准测试代码:
#include "benchmark/benchmark.h" #include <cstring> static void bench_memset(benchmark::State& state) { char buffer[16]; for(auto _ : state) { memset(buffer, '\0', 16); benchmark::ClobberMemory(); } } BENCHMARK(bench_memset); BENCHMARK_MAIN();
执行测试命令:
./my_benchmark --benchmark_perf_counters=BRANCH-MISSES,CACHE-MISSES,CACHE-REFERENCES --benchmark_counters_tabular=true
得到初始测试结果:
--------------------------------------------------------------------------------------------------- Benchmark Time CPU Iterations BRANCH-MISSES CACHE-MISSES CACHE-REFERENCES --------------------------------------------------------------------------------------------------- bench_memset 0.611 ns 0.611 ns 1000000000 7n 1000p 52n
当将测试中buffer大小调整为4096字节后,结果变为:
--------------------------------------------------------------------------------------------------- Benchmark Time CPU Iterations BRANCH-MISSES CACHE-MISSES CACHE-REFERENCES --------------------------------------------------------------------------------------------------- bench_memset 96.0 ns 96.0 ns 6959398 1.14952u 0 81.6163u
用户理解分支缺失、缓存缺失的核心概念,但不清楚性能计数器指标后的n、p、u等字母含义,查阅官方文档未找到相关说明,特此询问。
后缀字母含义解析
这些后缀是Google Benchmark为了让结果更易读,对性能计数器数值自动选择的归一化方式标识,具体含义如下:
n:代表单次迭代的绝对计数,即每运行一次基准测试循环,对应计数器的平均增量值。比如第一个结果里的7n,表示每次memset操作平均产生7次分支缺失。p:代表每千次迭代的计数,1000p即每执行一千次测试循环,对应计数器累计产生1000次缓存缺失。u:代表每微秒的计数,1.14952u表示每微秒内平均产生约1.15次分支缺失。- 无后缀:代表测试全程的总计数,即整个基准测试运行期间,计数器的累计总值。
Google Benchmark会根据计数器数值的量级自动切换归一化方式,确保结果直观易读。比如当单次迭代计数极小时,会优先展示总计数或每千次迭代计数;当计数与时间关联度更高时,会切换为每微秒计数。
内容的提问来源于stack exchange,提问作者Hunter
相关产品推荐
相关产品推荐

