gpt4 book ai didi

linux - sleep (0)?在代码中保持一致的时间?

转载 作者:太空狗 更新时间:2023-10-29 11:30:47 25 4
gpt4 key购买 nike

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

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

最佳答案

目前在 Linux(和一般的 POSIX)上推荐的 high-rez 时间接口(interface)是 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 中的符号冲突,对于定义了自己的 clock_gettime 的旧程序?但是动态库使用弱符号...

最好的 sleep 功能是nanosleep。它不会乱用信号或任何像 usleep 这样的废话。它被定义为只是 sleep ,没有任何其他副作用。它会告诉您是否早起(例如,根据信号),因此您不必调用其他时间函数。

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

如果您有一台多核机器和一个针对您正在优化的代码的单线程基准测试,您可以将其实时优先级固定到您的一个内核。确保您选择的核心不处理中断,否则您的键盘(以及其他所有内容)将被锁定,直到完成为止。使用 taskset(用于固定到一个 CPU)和 chrt(用于设置实时优先级)。看看我用这个技巧发送给 gmp-devel 的邮件: http://gmplib.org/list-archives/gmp-devel/2008-March/000789.html

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

关于linux - sleep (0)?在代码中保持一致的时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1851249/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com