gpt4 book ai didi

c++ - 分析 "Sleep"函数的测量时间

转载 作者:行者123 更新时间:2023-11-30 02:10:26 24 4
gpt4 key购买 nike

几天前我发布了这个问题: measuring time of a profiled function

(我希望没关系,我正在打开一个新线程,我只是在前几页中找不到旧线程)

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

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

这就是我让进程 sleep 太少的方法(时间流逝,当进程暂停时,Sleep 会考虑到它 - 但我不能!)...

现在,我的问题终于来了:
我怎样才能避免这个问题?如何正确测量“ sleep ”等功能的时间?

谢谢:)

最佳答案

sleep 方法几乎从不真正执行您所描述的“自旋”机制——当它真正需要做的只是在操作系统中设置一个计时器时,没有理由浪费这么多 CPU 时间,然后简单地停止运行,直到被计时器重新唤醒。如果一个已经因为 sleep 调用而被卡住的进程因为你挂起它而再次被卡住,那么它只是被挂起两次; “闹钟”回调并解除暂停,但应用程序仍然暂停,因为您暂停了它。如果您在 sleep 结束之前取消挂起,您的挂起/取消挂起将完全无效。

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

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


总而言之:

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

关于c++ - 分析 "Sleep"函数的测量时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4587065/

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