1
 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 上运行

  • 有时我的时间为零,因为我以纳秒为单位进行测量,我觉得很奇怪,怎么能在零纳秒内执行?

4

1 回答 1

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 上花费的时间将被忽略。

于 2013-10-25T17:42:51.363 回答