我试图通过测量每次迭代的时间来衡量函数的性能。 在这个过程中,我发现即使什么都不做,结果还是相差很大。
例如
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
所以无论是 ticks 还是 ns,最坏的情况下 22800 大约是 mean 的 1000 倍。
我在 grub 中执行了 isolcpus,并使用任务集运行它。简单的循环几乎什么都不做,做时间统计的哈希表在时间测量之外。
我错过了什么?
我在一台安装了 ubuntu 的笔记本电脑上运行它,CPU 是 Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz
最佳答案
谢谢大家的回答。 我无法停止的主要中断是本地定时器中断。而且似乎新的 3.10 内核将支持 tickless。我会试试那个。
关于c++ - 为什么我在时间测量中会出现如此巨大的抖动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20086633/