测量“睡眠”功能的时间

2023-12-02

前几天我发布了这个问题:测量轮廓函数的时间

(我希望我可以打开一个新线程,我只是在前几页中找不到旧的线程)

我注意到在我的分析过程中,我调用了“睡眠”方法 - 这就是问题所在...... 当我调用 SuspendThread/ResumeThread 时 - 睡眠进程暂停,但实际上 - 时间在继续!
我认为“睡眠”只是某种循环,只要开始时间和结束时间之间的差异足够大,它就会花费时间并停止。

好吧,假设您的分析进程需要休眠 1 分钟。
您在睡眠 2 秒后暂停了分析进程,然后去吃点东西。
15 分钟后您回来并恢复分析过程。
所分析的进程测量时间,发现超过 1 分钟过去了,它停止休眠。

这就是我让进程睡眠太少的方法(时间流逝,当进程挂起时,睡眠会考虑到它 - 但我不能!)...

现在,最后是我的问题:
我怎样才能避免这个问题?如何正确测量“睡眠”等功能的时间?

谢谢 :)


sleep方法几乎从不真正执行您所描述的“旋转”机制 - 当它真正需要做的只是在操作系统内设置一个计时器,然后简单地停止运行直到被计时器重新唤醒时,没有理由浪费这么多的CPU时间。如果某个进程已经由于以下原因而被冻结sleep呼叫再次被冻结,因为您暂停了它,然后它只是暂停了两次; “闹钟”回调并释放其暂停状态,但应用程序仍处于暂停状态,因为您暂停了它。如果您在sleep消失后,您的暂停/取消暂停将根本没有任何效果。

因此,线程根本不可能知道或关心为什么sleep花费的时间与预期不同。它只是在运行时没有运行代码sleeping。它停止运行代码,然后在一段时间后再次开始运行代码,检查挂钟只会告诉它它已经超时了多长时间,而不是导致它在那段时间被冻结的原因。 (也许它的优先级较低,操作系统非常繁忙,只是花了那么长时间才安排它在sleep ended.)

您能做的最接近的就是编写自己的sleep方法并仅将其用于调试目的。 (当不处于调试模式时,它可能应该调用系统睡眠方法,因此您不必更改函数外部的代码 - 通过使用条件编译#ifdef DEBUG/#endif.) That sleep应该完全按照你的建议去做:计算滴答声,直到“挂钟”说它已经等待了足够长的时间,如果滴答声之间存在意外的大间隙,则进一步推迟截止日期,因为那个时间没有“计算”。


所有这些都说:

也许你在这里问错了问题。你为什么要尝试分析sleep无论如何,并使其在手动停止程序时保持稳定?一旦您在外部冻结程序,准确的分析通常就会消失——它会丢失程序的几乎所有与时序相关的属性,特别是在 CPU 内存缓存行为方面。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

测量“睡眠”功能的时间 的相关文章

随机推荐