[英]VerySleepy Profiling c++ code
在對我的代碼進行性能分析以發現運行緩慢的過程中,我顯然有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
誰能告訴我這些功能是什么? 他們為什么要花這么長時間,以及如何解決它們。
謝謝
可能是在Win32 API中使用了函數來使線程“休眠”。 它們也可能用作線程同步,因此請檢查這些內容。
他們為此花費了大量的CPU時間,因為它們是為此而設計的。
WaitForSingleObject
函數可以等待以下對象:
因此,它可以用於其他可能的事情是控制台用戶輸入等待。
ZwDelayExecution
是Windows的內部功能。 可以看出,它用於實現Sleep
功能。 這是Sleep
功能的調用堆棧,因此您可以親眼看到它:
0 ntdll.dll ZwDelayExecution
1 kernel32.dll SleepEx
2 kernel32.dll Sleep
它可能使用Assembly低級功能來實現,因此可以以100ns的精度延遲線程。
MsgWaitForMultipleObjects
具有類似於WaitForSingleObject
目標。
從名稱來看,這3個功能似乎都處於阻塞狀態,因此它們花了很長時間,因為它們被設計為這樣做,但是它們在等待時不應使用任何CPU。
第一步之一應該始終是檢查文檔:
WaitForSingleObject
:
http://msdn.microsoft.com/zh-cn/library/windows/desktop/ms687032.aspx等待對象,例如線程,進程,互斥體。
MsgWaitForMultipleObjects
:
http://msdn.microsoft.com/zh-cn/library/windows/desktop/ms684242.aspx只需等待多個對象,就像WaitForSingleObject
一樣。
ZwDelayExecution
:
似乎沒有ZwDelayExecution
的文檔,但是我認為這是一個內部方法,當您調用Sleep
時會被調用。
無論如何,這個名字已經揭示了一部分。 “等待”和“延遲”功能應該花費時間。 如果要減少等待時間,您必須找出調用這些函數的方法。
舉個例子:
如果啟動一個新線程,然后等待它在主線程中完成,則將在WINAPI編程中以一種或另一種方式調用WaitForSingleObject
。 啟動線程甚至不必是您-可能是運行時本身。 該函數將等待,直到線程完成。 因此,這將花費一些時間並在WaitForSingleObject
阻塞程序,直到線程完成或發生超時為止。 這沒什么不好,這是預期的行為。
你開始對這些功能放大之前,你可能首先要確定什么樣的緩慢的程序是從痛苦。 Windows程序中有一個或多個線程大部分時間都在阻塞功能上是很正常的。
您首先需要確定您的實際關鍵線程是否受CPU限制。 在這種情況下,您不想放大那些花費大量時間的功能,而是想找到那些占用CPU時間的功能。
我對“非常困倦”沒有太多經驗,但是IIRC是一個采樣探查器,通常這些工具不太擅長測量CPU使用率。
僅在確定程序不受CPU限制之后,才應放大需要等待很多時間的功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.