测量异形“睡眠”功能的时间

时间:2011-01-03 18:17:12

标签: c++ time profile sleep

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

(我希望我可以打开一个新主题,我只是在少数几页中找不到旧主题)

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

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

这就是我让这个过程睡得太少的时间(时间过去了,当过程暂停时,睡眠将其考虑在内 - 但我不能!)...

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

谢谢:)

2 个答案:

答案 0 :(得分:4)

sleep方法几乎从不实际执行你所描述的“旋转”机制 - 没有理由浪费那么多的CPU时间,当它真正需要做的就是在操作系统中设置一个计时器,然后简单停止运行,直到被计时器重新唤醒。如果由于sleep调用而已冻结的进程因为您暂停而再次冻结,则会暂停两次; “闹钟”回叫并释放暂停,但由于你暂停了它,应用程序仍然被暂停。如果你在sleep消失之前取消暂停,你的暂停/取消暂停将无效。

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

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


所有这一切:

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

答案 1 :(得分:0)

我明白了 我暂停时会检查过程是否已暂停,如果是,我也会考虑手动暂停的时间。
谢谢大家:)