我正在阅读 OSTEP 的 single.dvi 章节。在作业部分中,它说:
你需要考虑的一件事情是计时器的精度和准确性。你可以使用的典型计时器是
gettimeofday();
,请查看 man 页面以获取详细信息。你会发现,gettimeofday()
返回自 1970 年以来的微秒数;但是,这并不意味着计时器精确到微秒。通过测量连续调用gettimeofday()
得出如何确切地计时;这将告诉你有多少次迭代你需要运行你的 null 系统调用测试,才能获得良好的测量结果。如果gettimeofday()
对你来说不够精确,你可以尝试使用 x86 计算机上提供的 rdtsc 指令。
我编写了一些代码来测试调用 gettimeofday()
函数的成本,如下所示:
#include <stdio.h>
#include <sys/time.h>
#define MAX_TIMES 100000
void m_gettimeofday() {
struct timeval current_time[MAX_TIMES];
int i;
for (i = 0; i < MAX_TIMES; ++i) {
gettimeofday(¤t_time[i], NULL);
}
printf("seconds: %ld\nmicro_seconds: %ld\n", current_time[0].tv_sec, current_time[0].tv_usec);
printf("seconds: %ld\nmicro_seconds: %ld\n", current_time[MAX_TIMES - 1].tv_sec, current_time[MAX_TIMES - 1].tv_usec);
printf("the average time of a gettimeofday function call is: %ld us\n", (current_time[MAX_TIMES - 1].tv_usec - current_time[0].tv_usec) / MAX_TIMES);
}
int main(int argc, char *argv[]) {
m_gettimeofday();
return 0;
}
然而,输出总是0微秒。看起来gettimeofday()
函数的精度正好为一微秒。我的测试代码有什么问题吗?还是我误解了作者的意思?感谢帮助!
CLOCK_REALTIME
时钟上使用clock_getres
函数来获取纳秒级分辨率。 - Ian Abbott