Linux 睡眠(0)?在代码中保持一致的时间?

Linux 睡眠(0)?在代码中保持一致的时间?,linux,time,consistency,Linux,Time,Consistency,现在我正在加载一个文件,然后使用gettimeofday并使用tv_usec跟踪CPU时间 我的成绩各不相同,我得到250到280分,但有时是300或500分。我编写了usleep和sleep(0)和(1),但没有成功。时间仍然相差很大。我认为睡眠(1)(linux中的秒,而不是ms中的windows睡眠)可以解决这个问题。如何以更一致的方式跟踪时间以进行测试?也许我应该等到有了更大的测试数据和更复杂的代码后再开始测量?您是否正在测量加载文件所需的时间?通常,如果您正在对一些已经非常快(亚秒)的

现在我正在加载一个文件,然后使用gettimeofday并使用tv_usec跟踪CPU时间


我的成绩各不相同,我得到250到280分,但有时是300或500分。我编写了usleep和sleep(0)和(1),但没有成功。时间仍然相差很大。我认为睡眠(1)(linux中的秒,而不是ms中的windows睡眠)可以解决这个问题。如何以更一致的方式跟踪时间以进行测试?也许我应该等到有了更大的测试数据和更复杂的代码后再开始测量?

您是否正在测量加载文件所需的时间?通常,如果您正在对一些已经非常快(亚秒)的代码进行性能测试,那么您将希望重复相同的代码多次(比如一千次或一百万次),对整个代码进行计时,然后将总时间除以迭代次数


话虽如此,我不太清楚您使用sleep()的目的是什么。你能给出一个你打算做什么的例子吗?

我建议把代码放在for循环中。在1000或10000次迭代中运行它。如果您只执行了一些说明,那么这会有问题,但它应该会有所帮助

当然,更大的数据集也有帮助


sleep将从cpu取消线程调度。它不能精确地计算时间。

在Linux(以及一般的POSIX)上,当前推荐的高rez时间接口是clock_gettime。请参阅手册页


clock_gettime(CLOCK_REALTIME, struct timespec *tp) //  for wall-clock time
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, struct timespec *tp) //  for CPU time
但是请阅读手册页。请注意,您需要链接到-lrt,因为我想POSIX是这么说的。也许是为了避免-lc中的符号冲突,对于定义了自己时钟的旧程序?但动态库使用弱符号

最好的睡眠功能是纳秒睡眠。它不会干扰信号或像usleep这样的废话。它被定义为只睡觉,没有任何其他副作用。它会告诉你,如果你醒得早(例如从信号中),那么你不必调用其他时间函数

不管怎样,您将很难测试一个涉及系统调用的短消息的代表。有大量的变化机会。e、 调度程序可能会决定其他一些工作需要做(如果您的流程刚刚启动,则不太可能;您还没有用完您的时间片)。CPU缓存(L2和TLB)很容易实现

如果您有一台多核机器和一个用于优化代码的单线程基准,您可以将它的实时优先级固定到您的一个核心上。确保您选择的核心不处理中断,否则您的键盘(以及其他所有内容)将被锁定,直到完成为止。使用taskset(用于固定到一个CPU)和chrt(用于设置实时优先级)。 请看我用以下技巧发送给gmp-devel的邮件:

哦,是的,为了获得最精确的计时,您可以自己使用rdtsc(在x86/amd64上)。如果你在你的工作台上没有任何其他系统调用,这不是一个坏主意。获取一个基准测试框架,将您的功能放入其中。GMP有一个相当不错的。不过,对于不在GMP中且被称为mpn_的基准功能,它可能设置得不好。我不记得了,值得一看