我正在尝试通过测量每次迭代的时间来衡量函数的性能。
在此过程中,我发现即使我什么也不做,结果仍然相差很大。

例如

volatile long count = 0;
for (int i = 0; i < N; ++i) {
    measure.begin();
    ++count;
    measure.end();
}

在measure.end()中,我测量时间差并保留unordered_map来跟踪时间计数。
我已经使用了clock_gettime和rdtsc,但是总是有大约1%的数据点与均值相距甚远(以1000为因子)。

这是上面的循环生成的:
T:  count   percentile
18  117563  11.7563%
19  111821  22.9384%
21  201605  43.0989%
22  541095  97.2084%
23  2136    97.422%
24  2783    97.7003%
...
406 1   99.9994%
3678    1   99.9995%
6662    1   99.9996%
17945   1   99.9997%
18148   1   99.9998%
18181   1   99.9999%
22800   1   100%

mean:21

因此,无论是滴答声还是纳秒,最坏的情况22800都比平均值大1000倍。

我在grub中执行过isolcpus,并通过taskset运行它。简单循环几乎什么也不做,用于进行时间计数统计的哈希表不在时间测量范围之内。

我想念什么?

我正在安装了ubuntu的笔记本电脑上运行该处理器,CPU为Intel(R)Core(TM)i5-2520M CPU @ 2.50GHz

最佳答案

感谢您的所有答案。
我无法停止的主要中断是本地计时器中断。而且似乎新的3.10内核将支持无滴答。我会尝试的。

关于c++ - 为什么在时间测量中会出现如此巨大的抖动?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20086633/

10-13 07:20
查看更多