我试图测量一段代码的时间,并注意到当我从编辑器 QtCreator 中运行程序时,与从 gnome 终端中启动的 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)。