我正在尝试通过测量每次迭代的时间来测量函数的性能。 在这个过程中,我发现即使我什么都不做,结果仍然有很大差异。
e.g。
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
无论是滴答还是ns,最坏的情况22800大约是平均值的1000倍。
我在grub中执行了isolcpus并且正在使用taskset运行它。简单的循环几乎什么都不做,用于进行时间计数统计的哈希表超出了时间测量值。
我错过了什么?
我在安装了ubuntu的笔记本电脑上运行它,CPU是Intel(R)Core(TM)i5-2520M CPU @ 2.50GHz
答案 0 :(得分:1)
感谢您的所有答案。 我无法停止的主要中断是本地定时器中断。似乎新的3.10内核将支持无滴答。我会尝试那个。