1

在分析我的代码以找出运行缓慢的原因时,我有 3 个函数显然需要永远使用,这就是非常困倦的说法。

这些功能是:

ZwDelayExecution    20.460813   20.460813   19.987685   19.987685
MsgWaitForMultipleObjects   20.460813   20.460813   19.987685   19.987685
WaitForSingleObject 20.361805   20.361805   19.890967   19.890967

谁能告诉我这些功能是什么?为什么他们需要这么长时间,以及如何解决它们。

谢谢

4

4 回答 4

7

可能这些函数用于使 Win32 API 中的线程“休眠”。它们也可能被用作线程同步,所以检查这些东西。

它们占用了大量 CPU 时间,因为它们就是为此而设计的。


WaitForSingleObject函数可以等待以下对象:

  • 变更通知
  • 控制台输入
  • 事件
  • 内存资源通知
  • 互斥体
  • 过程
  • 信号
  • 线
  • 等待定时器

所以它可以用于的另一个可能的事情是控制台用户输入等待。


ZwDelayExecution是 Windows 的内部函数。可以看出它是用来实现Sleep功能的。这是Sleep函数的调用堆栈,因此您可以亲眼看到它:

0  ntdll.dll        ZwDelayExecution    
1  kernel32.dll     SleepEx     
2  kernel32.dll     Sleep   

它可能使用Assembly 低级特性来实现,因此它可以以100ns 的精度延迟线程。


MsgWaitForMultipleObjects有类似的WaitForSingleObject目标。

于 2013-05-02T11:12:19.577 回答
1

第一步应该始终是检查文档:

无论如何,这个名字已经揭示了它的一部分。“等待”和“延迟”功能应该需要时间。如果你想减少等待时间,你必须找出调用这些函数的原因。

给你举个例子:
如果你开始一个新线程,然后在你的主线程中等待它完成,你将WaitForSingleObject在 WINAPI 编程中调用一种或另一种方法。甚至不必是您启动线程 - 它可能是运行时本身。该函数将等待线程完成。因此,在WaitForSingleObject线程完成或发生超时之前,这将需要时间并阻塞程序。这没什么不好,这是预期的行为。

于 2013-05-02T11:13:39.007 回答
1

从名称上看,所有 3 个函数似乎都被阻塞了,所以它们需要很长时间,因为它们被设计为这样做,但它们在等待时不应该使用任何 CPU。

于 2013-05-02T11:09:23.147 回答
0

在开始放大这些函数之前,您可能首先想确定您的程序遇到了什么样的缓慢。Windows 程序有一个或多个线程将大部分时间花在阻塞函数上是很正常的。

您首先需要确定您的实际关键线程是否受 CPU 限制。在这种情况下,您不想放大占用大量挂钟时间的函数,而是希望找到那些占用 CPU 时间的函数。

我对非常困倦没有太多经验,但 IIRC 它是一个采样分析器,而且它们通常不擅长测量 CPU 使用率。

只有在您确定您的程序不受 CPU 限制之后,您才应该放大等待很多的函数。

于 2013-05-02T12:03:32.057 回答