C ++性能测量中的一些问题

时间:2013-10-25 17:36:27

标签: c++ linux optimization profiling performance-testing

 timespec start, end;
 clock_gettime(CLOCK_MONOTONIC, &start);
 ---code--lookup in a unordered map <string, int>
 clock_gettime(CLOCK_MONOTONIC, &end);
 int diff = diff_ns(end, start);

Results:
 SAMPLE   MIN(ns)   MAX(ns)   AVG(ns)
           100      1000      3000      1430
           500      1000      2000      1436
          1000         0     16000      1441
          5000         0     15000      1479
         10000         0     26000      1489
         50000         0    363000      1589
        100000         0    110000      1591
        200000         0    804000      1659
        300000         0    118000      1668
        400000      1000    354000      1701
        500000         0   8679000      1712
        600000         0    809000      1701
        700000         0    373000      1704
        800000         0    850000      1716
        900000         0    856000      1736
       1000000         0    817000      1730
  • 如何忽略CPU计算clock_gettime所花费的时间,因为最后我们花了很多时间来调用clock_gettime?

  • 我在单线程程序中运行测试...但是如何确保没有上下文切换发生,因为其他进程也可能在VM上运行

  • 有时我会零时间,因为我在纳秒测量,我觉得奇怪,有什么东西可以在零纳秒内执行?

1 个答案:

答案 0 :(得分:4)

  

我在单线程程序中运行测试...但是如何确保没有上下文切换发生,因为其他进程也可能在VM上运行

终止所有不需要的流程,如果您有选项,请提高配置流程的优先级。

除此之外,您可以使用profcallgrind来分析您的计划。

  

有时我会花零时间,因为我测量的是纳秒,我觉得很奇怪,有什么东西可以在零纳秒内执行?

执行时间为0 ns,因为CPU时钟精度高于10 ms。

测量更多迭代后的时间,您将获得更好的结果。


执行更多查找,然后平均值:

 timespec start, end;
 clock_gettime(CLOCK_MONOTONIC, &start);
 for (int i=0;i<10000;++i)
 ---code--lookup in a unordered map <string, int>
 clock_gettime(CLOCK_MONOTONIC, &end);
 int diff = diff_ns(end, start)/10000;

就像在clock_gettime中花费的时间一样,将被忽略。