c++ - 为什么我在时间测量中会出现如此巨大的抖动?

标签 c++ linux latency affinity

我试图通过测量每次迭代的时间来衡量函数的性能。 在这个过程中,我发现即使什么都不做,结果还是相差很大。

例如

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/

相关文章:

linux - Bash 忽略特定命令的错误

node.js - mongodb 在 linux node.js 上安装错误

linux - 从 makefile 管道两个命令不起作用

python - 如何在 tensorflow 中使用自定义 python 函数预取数据

c++ - 如何将模板存储为典型 C++ 类的成员

c++ - 获取 Cimg 库中渲染文本的尺寸

c++ - 控制台命令系统

c++ - LLVM ParseIR 段错误

java - Apache Storm - Spout/Bolt 因高延迟而崩溃

tcp - 发送/接收 tcp 数据包时 16 毫秒量化