gno*_*ule 2 c linux kernel glibc clock
正如已经有一段时间所知(例如,参见这个老问题,以及当你谷歌这个时弹出的错误报告),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);
Run Code Online (Sandbox Code Playgroud)
对小阵列(大约1,000个元素)进行排序会报告合理的时间.当我使用3种排序算法对较大的(10,000+)进行排序时,3个中的1-2个报告返回负排序时间.我尝试了手册页中提到的所有时钟类型,而不仅仅是CLOCK_MONOTONIC_RAW - 没有变化.
(1)我在代码中忽略了什么?
(2)是否有替代clock_gettime()的方法,以递增的方式测量时间比秒更精确?我不需要nanonseconds,但秒太粗糙,无法真正帮助.
系统:
- Ubuntu 12.04.
- 内核3.2.0-30
- gcc 4.6.3.
- libc version 2.15
- 使用-lrt编译
这与clock_gettime单调时钟的神话没有任何关系,而单调时钟实际上并不是单调的(这可能在现实中具有基础,但它从未被很好地记录并且可能很久以前就已经修复).这只是你程序中的一个错误.tv_nsec是时间值的纳秒部分,存储为两个字段:
tv_sec - 整秒钟tv_nsec - 纳秒,范围为0至999999999当然tv_nsec会在tv_sec增量时从999999999向后跳到0 .要计算timespec结构的差异,您需要以秒为单位获取1000000000倍的差异,并将其添加到以纳秒为单位的差异中.当然,如果您不首先转换为64位类型,这可能会很快溢出.
| 归档时间: |
|
| 查看次数: |
2004 次 |
| 最近记录: |