2013-05-02 91 views
1

在分析我的代码以查找进展缓慢的时候,我有3个显然永远在使用的函数,那就是很困的说。VerySleepy分析C++代码

这些功能是:

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 

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

感谢

+0

你不解决这些问题。你发现你的代码中为什么会导致它们被调用。为此你[*抽样堆栈*](http://stackoverflow.com/a/378024/23771)。只有一个样本应该足够了。 – 2013-05-02 11:50:45

回答

7

可能该函数用于使线程在Win32 API中“睡眠”。也可以将它们用作线程同步,以便检查这些事情。

他们花费了很多CPU时间,因为它们是为此设计的。


WaitForSingleObject功能可以等待下列对象:

  • 更改通知
  • 控制台输入
  • 事件
  • 内存资源通知
  • 互斥
  • 过程
  • 信号灯
  • 螺纹
  • 可等待计时器

那么,它可以被用于其它可能的事情是控制台用户输入的等待。


ZwDelayExecution是Windows的内部函数。可以看出它用于实现Sleep功能。下面是调用堆栈Sleep功能,这样你就可以用自己的眼睛看到它:

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

它probaly采用大会低级功能认识到,因此它可以延迟线程具有100ns的精度。


MsgWaitForMultipleObjects有一个类似于WaitForSingleObject的目标。

1

判断上的名字,所有的3个功能似乎阻塞,因此,他们需要很长的时间,因为他们的目的是这样做的,但在等待,他们不应该使用任何CPU。

1

一个的第一步骤应该总是检查文档:

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

给你举一个例子:
如果你开始一个新的线程,然后等待它在你的主线程完成,你会调用WINAPI编程WaitForSingleObject这样或那样的。它甚至不必是你开始线程的人 - 它可能是运行时本身。该函数将等待直到线程结束。因此,它需要时间和WaitForSingleObject阻止此程序,直到线程完成或发生超时。这没什么不好,这是有意的行为。

0

在您开始放大这些功能之前,您可能首先需要确定您的程序正在遭受什么缓慢的影响。 Windows程序有一个或多个线程花费大部分时间来阻塞函数是非常正常的。

您首先需要确定您的实际关键线程是否是CPU的约束。在这种情况下,你不想放大需要花费大量关闭挂钟时间,你想找到那些占用CPU时间函数的功能。

我没有用很困了丰富的经验,但IIRC它是一个采样分析器,以及那些通常不以测量CPU使用率这么好。

你确定只有在你的程序是不是CPU的约束,那么你应该放大等候了很多的功能。