正如已经有一段时间所知(例如,参见这个老问题,以及当你谷歌这个时弹出的错误报告),clock_gettime()似乎不会单调地报告时间.为了排除我可能监督的任何愚蠢错误,这里是相关代码(摘自大型程序):
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()的方法,以递增的方式测量时间比秒更精确?我不需要nanonseconds,但秒太粗糙,无法真正帮助.
系统:
- Ubuntu 12.04.
- 内核3.2.0-30
- gcc 4.6.3.
- libc version 2.15
- 使用-lrt编译