我試圖在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()將在程序壽命期間被調用很多次,即使在測試它時只運行一次。而且我可以減少應用程序的響應時間非常重要。
非常感謝您提供任何答案!
你必須選擇正確的戰鬥。假設你*可以*使GetResult的1%而不是10%,那麼你只能讓你的程序加快9%。你還有90%的潛在優化目標,你實際上可能有源代碼。你不能優化埋在clr.dll中的代碼 –
@HansPassant正如我寫的,GetResult()在測試時只是執行的一小部分,因爲啓動階段非常緊張。隨着時間的推移,當GetResult()被調用了幾千次時,我認爲它幾乎會佔用100%的CPU時間。爲了澄清,應用程序的響應時間幾乎100%依賴於GetResult()。那麼即使沒有觸及GetResult(),也有可能優化30%嗎? – DukeOf1Cat