Dot-Net

為什麼 GetMessageW 會在我的 WPF 應用程序中佔用大量 CPU 使用率?

  • December 15, 2010

我手上有一個嚴重的撓頭。我正在調查我們應用程序中 WPF 組件的性能問題。

我們的 .net 應用程序非常大,而且幾乎完全採用 Windows 形式。作為一項新計劃的一部分,我們使用豐富的 WPF ui 重寫了我們的核心組件之一。有很多 WinForms<–>WPF 互操作與這個東西粘合在一起,我懷疑這可能與我所看到的有關。

當我在 ANTS 分析器中分析緩慢的操作時,我看到函式 UnsafeNativeMethods.IntGetMessageW 內部發生了很多活動。ANTS 報告的 CPU 活動與我們所有的業務邏輯和 wpf 渲染內容的組合一樣多。該函式沒有使用循環的託管程式碼下線,因此無論 IntGetMessageW 正在做什麼,這就是我所追求的。

我不是特別精通 win32 程式,但我知道在這種情況下消息循環的基礎知識。不過,我在這裡看到的都不是我們手動執行的任何操作——在我們的程式碼中,我們沒有直接與底層消息循環本身進行互動,也沒有與任何可以在 WPF 調度程序上訪問的更複雜的東西進行互動。

我們這裡討論的 WPF 組件是繼承自 Window 編寫的(即,它不僅僅是一個控制項/使用者控制項),我們使用 ShowDialog 來展示它,而不是我們用於在該組件的舊 WinForms 版本上呼叫 ShowDialog 的更高級別邏輯。我們在 WPF 組件內部使用了一些 WindowsFormsIntegrationHost 控制項,以保持與我們現有的一些無法在 WPF 中重寫的部分的兼容性。

我已經研究了好幾天了,但從來沒有發現很多事情要做。我一直在尋找有關輸入消息(滑鼠和鍵盤)的模糊相關文章,但我不知道我能做些什麼來驗證這一點;我已經嘗試過刪除程式碼以刪除我可以進行的所有滑鼠/鍵盤操作。

我很難到達任何地方,主要是因為這行程式碼是完全隔離的(不是我可以指出實際上來自我們的程式碼的任何東西的父或子),並且對於它正在做什麼完全不透明。

這是 ShowDialog 函式的 ANTS 呼叫圖的圖像,顯示了到達此處的呼叫路徑: 替代文字

我完全意識到這可能只是作為 WPF 的一部分必須完成的事情(儘管我們在 WPF 中編寫的其他組件不會顯示這種行為),或者這只是 ANTS 探查器中的一個非常奇怪的錯誤,但在這一點我需要以一種或另一種方式驗證它。如果有人能告訴我這裡正在發生或可能發生的事情——或者給我指出一些我自己能夠弄清楚的方法,我會按照你的方式引導各種善業。

更新:針對下面的一些討論,這是 ANTS 的另一種觀點——這個觀點更好地說明了我的困惑(這是“CPU 時間”模式下的 ANTS 視圖)。我匆忙審查了我們的部分程式碼,但沒有一個與系統相關的功能:

替代文字

感謝您的關注!

在分析應用程序時,您需要區分方法所*花費的時間和所消耗的CPU 週期*。**許多分析工具會向您顯示在一個方法中花費的總時間——在類似的情況下,GetMessageW這將是相當高的。GUI 應用程序的主執行緒的所有活動似乎都發生在該方法中。但是,這不一定是問題……這可能只是等待同步對象的主要消息泵,而實際上並未消耗週期。

**我建議您首先使用 ANTS 分析器中的採樣功能來辨識最常呼叫的方法,並將這些方法與消耗最多 CPU 週期的方法相關聯。**完成此操作後,您可以決定在何處檢測應用程序以進一步深入了解 CPU 密集型位置的呼叫圖是什麼樣的。

**您應該首先懷疑自己的程式碼。**WPF 或 Win32 基礎結構之類的東西很少會導致性能低下或 CPU 使用率高。很可能,問題出在您的實現中——它可以幫助您全面了解 CPU 週期在您的程序中的使用情況。

**我建議您也花一些時間學習探查器的功能以使其最有效。**探查器可能是複雜且令人困惑的工具,直到您了解它們試圖向您展示的內容。如果您還沒有這樣做,RedGate 的連結教程應該是一個很好的起點。例如,時間軸視圖實際上可能是一個很好的起點,可以開始查看高 CPU 活動發​​生的位置,並將您的分析限制在已執行程式碼的那些段上。

替代文字

呼叫圖是 ANTS 中另一個有用的工具,因為它可以幫助您深入研究最昂貴的程式碼區域。關鍵是要確保您著眼於總體成本,而不僅僅是總體時間

替代文字

是的,這很正常。任何 GUI 應用程序總是在執行 GetMessageW(),等待 Windows 向它發送消息。這樣做實際上並沒有消耗 CPU 週期,只是在內部同步對像上阻塞,直到發出某種 UI 事件信號。

這當然會使分析 UI 應用程序變得困難,您確實需要測試應用程序子組件的單元測試。

引用自:https://stackoverflow.com/questions/4127625