2013-05-02 87 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的約束,那麼你應該放大等候了很多的功能。