【发布时间】:2021-09-08 08:40:52
【问题描述】:
我正在阅读 OSTEP 的 single.dvi 章节。在作业部分,它说:
您必须考虑的一件事是计时器的精度和准确性。您可以使用的典型计时器是
gettimeofday();阅读手册页了解详细信息。你会看到gettimeofday()返回自 1970 年以来的时间(以微秒为单位);然而,这并不意味着 计时器精确到微秒。测量背靠背呼叫 到gettimeofday()了解计时器的精确度 盟友是;这将告诉您空系统调用的迭代次数 测试您必须运行才能获得良好的测量结果。如果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() 函数的精度似乎正好是一微秒。我的测试代码有什么问题?还是我误解了作者的意思?感谢您的帮助!
【问题讨论】:
-
pubs.opengroup.org/onlinepubs/9699919799/functions/… ==> "未指定系统时钟的分辨率。"和“应用程序应该使用 clock_gettime() 函数而不是过时的 gettimeofday() 函数。”
-
这是否意味着函数的准确性是不确定的?
-
您可以在
CLOCK_REALTIME时钟上使用clock_getres函数来获得以纳秒为单位的分辨率。 -
一个不保证准确的函数仍然可能给出完全准确的结果。不能依靠它来做到这一点。
-
POSIX 未指定分辨率。并不意味着您的环境未指定它。在您的计算机中,对于您当前版本的操作系统/C 库,它是一个特定值;您需要检查您的文档。
标签: c gettimeofday