2012-11-14 61 views
3

我試圖在Visual Studio中使用內置分析器來剖析.NET應用程序。跟蹤CPU樣本,我遇到了一些奇怪的事情。在應用程序的一部分,我有以下(簡化爲清晰):visual studio profiler [clr.dll]

var requestObject = new RequestObject(parameters); 
var result = GetResult(requestObject,"stringvalue"); 

我看到第二行使用約10%的樣本。但是,GetResult()方法僅使用約7%,其餘的似乎在[clr.dll]中。我知道clr.dll負責垃圾收集,JIT編譯,上下文切換等,而GetResult()方法相當複雜(跨越多個程序集,可能使用多個線程),所以這些行爲中的一些操作是不合理的一旦該方法返回。 RequestObject也有點複雜,因此可能與它有關。

我的問題是:我可以跟蹤到底發生了什麼,我能做些什麼來使其更快?請注意,3%聽起來不太好,但GetResult()將在程序壽命期間被調用很多次,即使在測試它時只運行一次。而且我可以減少應用程序的響應時間非常重要。

非常感謝您提供任何答案!

+0

你必須選擇正確的戰鬥。假設你*可以*使GetResult的1%而不是10%,那麼你只能讓你的程序加快9%。你還有90%的潛在優化目標,你實際上可能有源代碼。你不能優化埋在clr.dll中的代碼 –

+1

@HansPassant正如我寫的,GetResult()在測試時只是執行的一小部分,因爲啓動階段非常緊張。隨着時間的推移,當GetResult()被調用了幾千次時,我認爲它幾乎會佔用100%的CPU時間。爲了澄清,應用程序的響應時間幾乎100%依賴於GetResult()。那麼即使沒有觸及GetResult(),也有可能優化30%嗎? – DukeOf1Cat

回答

1

你並不孤單試圖找出探查器輸出的含義。 SO有很多這樣的問題。 我在一個大的.net應用程序中工作,並且我嘗試了各種分析器,並且我知道這不是人們被教導的內容,但實際工作的是this method。 首先,您可以在初始化過程中採集一些樣本,並在基本運行期間採集其他樣本。你不必將兩者堆積在一起,並試圖猜測每個階段的負載會是什麼樣的,而沒有其他的負載。另外,如果只看CPU時間,由於額外的I/O,您將錯過任何加速機會。 你不應該假設沒有任何,或者它不重要。 如果你確實設法找到一個只有CPU的加速機會,並修復它,那麼你沒有找到的部分成爲整體的一大部分。 你可能會發現,如果你找不到其他的東西來解決問題,那麼你可能會認爲沒有別的東西,事實上有,而且可能很大。 如果您自己抽取樣品,您可以清楚瞭解成本計算時間。

你可能想說「但那不準確!」 好的,如果有什麼可以修復的話,修復它可以節省90%的時間,但是你的查詢是不準確的,並且說它需要80%或者95%,這會阻止你修復它並獲得10加速? 事實是,當你的目標是真正發現問題時,而不是僅僅測量它們,它們越大,所需的樣本就越少。

+0

是的,我在相關的文章中閱讀了這個解決方案。整個cyckle需要大約500毫秒的時間才能運行,所以我認爲很難在整個時間範圍內手動採集樣本。如果我手動觸發循環(通過連接到應用程序並調用一個方法),然後點擊暫停,那麼很可能我總是會在同一個點擊中它,因爲有反應時間等等。您是否有建議進行自動操作這個? – DukeOf1Cat

+0

另外,如果我做的東西clr.dll不是一回事,但許多不同?那麼他們可能只會在我的樣品中顯示一次,所以我怎麼知道我是否找到了什麼? – DukeOf1Cat

+1

@Joel:第一個問題:幾個答案:1)嘗試一下,看看,2)在你的半秒過程中放置​​一個像100次的臨時循環。第二個問題:機會是在clr.dll中,但堆棧告訴你代碼在請求它。所以,例如,如果你看到它做了很多'新的GetResult',你可以檢查是否可以重新使用舊的 - 這樣的東西。關鍵是,你可以用你的整個大腦理解發生的事情,而不是僅僅爲了一些數字而感到困惑。 –

2

您可能會考慮使用可免費下載的PerfView工具。我同意邁克在這種情況下(網絡請求)CPU可能不是主導因素,所以使用CPU分析器很容易不準確。 PerfView可以執行CPU分析,但它也能夠進行'掛鐘'分析(請參閱PerfView歡迎頁面上的'掛鐘/鎖定時間'鏈接)。這個視圖顯示了CPU和阻塞,但在解釋數據時需要更加小心(你必須找到正確的線程幷包含感興趣的線程段)。如果這是一個ASP.NET應用程序,則有一個特殊的視圖(ASP.NET線程時間堆棧),這是特別感興趣的(也在文檔中)。

壞消息是沒有理解你的分析器告訴你什麼的替代品,所以你將不得不花費一些時間來學習這個工具告訴你什麼。我認爲這是值得的,並且有PerfView Videos,並且在工具中內置了相當不錯的文檔來幫助你,但是你必須願意投入一些時間(例如一個小時)。

好消息是,您的投資回報是不平凡的。您應該能夠在一個小時內找出您的特定問題,並且只需幾個小時的投資,您就可以在幾乎任何應用程序(甚至是您沒有構建的應用程序)中計算出各種各樣的問題。該工具功能非常強大,但具有強大功能的調查有很多潛在途徑,並且具有濫用數據和混淆的能力。

0

這篇文章很舊,但我想澄清一些事情。在當前實現profiler時,只要你看到[],這意味着我們知道dll的名字,但無法解析它的符號。一個原因是您沒有在您的sysmbol設置中選擇Microsoft符號服務器。另一種可能是模塊是ngen(其中你會看到[])。在這種情況下,您將需要生成ngen pdb以實際獲取符號解析。一旦發生這種情況,您應該能夠清楚地看到哪些函數使用了哪些部分的cpu。

相關問題