[英]Why does my benchmark randomly appear to run 3x as fast, and why does running it inside perf make this happen much more often?
我写了一个基准测试来测试一些特定的功能。 运行基准测试通常会给出一致的结果,但在每个基准测试用例中,大约十分之一的运行速度似乎快了 3 倍。
我想知道是否有某种分支预测或缓存位置问题影响了这一点,所以我在perf
运行它,如下所示:
sudo perf stat -B -e cache-references,cache-misses,task-clock,context-switches,cpu-migrations,page-faults,cycles,instructions,branches,branch-misses ./my_benchmark
现在结果相反:大约十分之九它运行得更快,在这种情况下, perf stat
输出如下所示:
Performance counter stats for './my_benchmark':
336,011 cache-references # 75.756 M/sec (41.40%)
74,722 cache-misses # 22.238 % of all cache refs
4.435442 task-clock (msec) # 0.964 CPUs utilized
0 context-switches # 0.000 K/sec
0 cpu-migrations # 0.000 K/sec
572 page-faults # 0.129 M/sec
13,745,945 cycles # 3.099 GHz
16,521,518 instructions # 1.20 insn per cycle
4,453,340 branches # 1004.035 M/sec
91,336 branch-misses # 2.05% of all branches (58.60%)
0.004603313 seconds time elapsed
在大约十分之一的试验中,它的运行速度要慢 3 倍,结果如下:
Performance counter stats for './my_benchmark':
348,441 cache-references # 22.569 M/sec (74.14%)
112,153 cache-misses # 32.187 % of all cache refs (74.14%)
15.439061 task-clock (msec) # 0.965 CPUs utilized
0 context-switches # 0.000 K/sec
0 cpu-migrations # 0.000 K/sec
572 page-faults # 0.037 M/sec
13,717,144 cycles # 0.888 GHz (62.52%)
16,951,632 instructions # 1.24 insn per cycle (88.40%)
4,463,213 branches # 289.086 M/sec
70,185 branch-misses # 1.57% of all branches (89.20%)
0.015999175 seconds time elapsed
我注意到任务似乎总是以大致相同的周期数完成,但频率不同——在“快速”情况下,它显示类似于 3GHz 的频率,而在慢速情况下,它显示类似于 900 MHz 的频率。 不过,我不明确知道这个统计数据是什么意思,所以我不知道这是否只是类似周期数和更长运行时间的同义反复结果,或者这是否意味着处理器的时钟实际上以不同的速度运行。
我确实注意到,在这两种情况下,它都说“上下文切换:0”和“cpu 迁移:0”,所以看起来放缓并不是来自被抢占的基准测试。
这里发生了什么,我可以编写(或启动?)我的程序,以便我始终获得更快的性能?
CPU频率通常会根据负载而变化......我会在运行之前强制锁定频率
你在什么操作系统上?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.