繁体   English   中英

为什么我的基准测试随机看起来运行速度是原来的 3 倍,为什么在 perf 中运行它会更频繁地发生这种情况?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM