C++绩效衡量中的一些问题

Some issues in C++ performance measurement

本文关键字:问题 C++      更新时间:2023-10-16
 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 上运行

  • 有时我得到零时间,因为我以纳秒为单位测量,我觉得很奇怪,某件事如何在零纳秒内执行?

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

终止所有不需要的进程,如果有选择,请提高所分析进程的优先级。

除此之外,您可以使用 prof 或 callgrind 来分析您的程序。

有时我得到零时间,因为我以纳秒为单位测量,我觉得很奇怪,某件事如何在零纳秒内执行?

您将获得 0 ns 的执行时间,因为 CPU 时钟精度高于 10 毫秒。

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


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

 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度过的这段时间将被忽视。