正如众所周知的那样(参见,例如,这个老问题 https://stackoverflow.com/questions/3657289/linux-clock-gettimeclock-monotonic-strange-non-monotonic-behavior,以及当您用 google 搜索时弹出的错误报告),clock_gettime() 似乎不会单调地报告时间。为了排除我可能发现的任何愚蠢错误,这里是相关代码(摘自较大的程序):
<include time.h>
long nano_1, nano_2;
double delta;
struct timespec tspec, *tspec_ptr;
clock_gettime(CLOCK_MONOTONIC_RAW, tspec_ptr);
nano_1 = tspec.tv_nsec;
sort_selection(sorted_ptr, n);
clock_gettime(CLOCK_MONOTONIC_RAW, tspec_ptr);
nano_2 = tspec.tv_nsec;
delta = (nano_2 - nano_1)/1000000.0;
printf("\nSelection sort took %g micro seconds.\n", (double) delta);
对小数组(大约 1,000 个元素)进行排序会报告合理的次数。当我使用 3 种排序算法对较大的(10,000+)排序时,3 种算法中的 1-2 种会报告负排序时间。我尝试了手册页中提到的所有时钟类型,不仅仅是 CLOCK_MONOTONIC_RAW - 没有变化。
(1) 我在代码中忽略了什么?
(2) 是否有替代clock_gettime() 的方法来以比秒更准确的增量来测量时间?我不需要纳秒,但秒太粗糙,无法真正提供帮助。
System:
- Ubuntu 12.04。
- 内核3.2.0-30
- 海湾合作委员会 4.6.3。
- libc 版本 2.15
- 使用 -lrt 编译
这与神话无关clock_gettime
的单调时钟实际上并不是单调的(这可能有现实基础,但从未得到充分记录,并且可能很久以前就已修复)。这只是你程序中的一个错误。tv_nsec
是存储为两个字段的时间值的纳秒部分:
-
tv_sec
- 整秒
-
tv_nsec
- 0 到 999999999 范围内的纳秒
当然tv_nsec
将从 999999999 向后跳到 0 时tv_sec
增量。计算差异timespec
结构体,您需要以秒为单位的差异的 1000000000 倍,并将其添加到以纳秒为单位的差异。当然,如果您不先转换为 64 位类型,这可能很快就会溢出。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)