【发布时间】:2020-11-23 21:48:55
【问题描述】:
我试图测量一段 sn-p 代码的时间,并注意到当我从我的编辑器 QtCreator 中运行程序时,与我从 bash shell 启动时相比,时间快了大约 50ns一个侏儒终端。我正在使用 Ubuntu 20.04 作为操作系统。
一个小程序重现我的问题:
#include <stdio.h>
#include <time.h>
struct timespec now() {
struct timespec now;
clock_gettime(CLOCK_MONOTONIC, &now);
return now;
}
long interval_ns(struct timespec tick, struct timespec tock) {
return (tock.tv_sec - tick.tv_sec) * 1000000000L
+ (tock.tv_nsec - tick.tv_nsec);
}
int main() {
// sleep(1);
for (size_t i = 0; i < 10; i++) {
struct timespec tick = now();
struct timespec tock = now();
long elapsed = interval_ns(tick, tock);
printf("It took %lu ns\n", elapsed);
}
return 0;
}
在 QtCreator 中运行时的输出
It took 84 ns
It took 20 ns
It took 20 ns
It took 21 ns
It took 21 ns
It took 21 ns
It took 22 ns
It took 21 ns
It took 20 ns
It took 21 ns
当从终端内的 shell 运行时:
$ ./foo
It took 407 ns
It took 136 ns
It took 74 ns
It took 73 ns
It took 77 ns
It took 79 ns
It took 74 ns
It took 81 ns
It took 74 ns
It took 78 ns
我尝试过但没有任何影响的事情
- 让 QtCreator 在终端中启动程序
- 使用 rdtsc 和 rdtscp 调用而不是 clock_gettime(运行时的相对差异相同)
- 通过在
env -i下运行从终端清除环境 - 使用 sh 而不是 bash 启动程序
我已经验证在所有情况下都调用了相同的二进制文件。 我已经验证在所有情况下程序的 nice 值都是 0。
问题
为什么从我的 shell 启动程序会有所不同?有什么建议可以尝试吗?
更新
-
如果我在 main 的开头添加 sleep(1) 调用,QtCreator 和 gnome-terminal/bash 调用都会报告更长的执行时间。
-
如果我在 main 的开头添加了一个 system("ps -H") 调用,但删除了前面提到的 sleep(1):两个调用都报告了较短的执行时间(~20 ns)。
【问题讨论】:
-
旁白:当
long是32 位时,代码很容易溢出。建议long long interval_ns(struct timespec tick, struct timespec tock) { return (tock.tv_sec - tick.tv_sec) * 1000000000LL + (tock.tv_nsec - tick.tv_nsec); }(类型更改和LL)
标签: c linux x86 microbenchmark cpu-cycles