最近測試報了一個問題:頁面加載慢,代碼慢怎麼辦,代碼慢在了哪裏呢?於是決定使用DotTrace來進行性能分析,簡直打開了通往新世界的大門,玩兒起來太爽了。接下來我用這篇實踐來手把手教大家怎麼玩兒DotTrace.
- DotTrace簡介,簡單介紹DotTrace如何使用,安裝方式,配置說明
- DotTrace實踐,使用DotTrace進行列表加載慢、導出慢的問題分析,如何使用DotTrace進行性能分析,包括Controller接口調試以及單元測試接口調試
好,接下來就依據目錄順序來講解下。
DotTrace簡介
什麼是DotTrace,在項目開發之中,前期可能主要以保證任務完成爲主,對於性能優化主要在於開發完成之後再來進行。可能在測試的時候發現部分接口的代碼執行時間過長,但是又毫無頭緒,這個時候你就需要性能分析工具來協助你排查問題了。就像我現在遇到的情況,別人說你慢,你得查出哪裏慢,是否能優化,如果不慢,確實需要那麼多時間,你也可以給出證據。
DotTrace安裝
我這裏使用的是VS2019集成版,你也可以考慮使用本地安裝包,簡單介紹下集成的安裝方式,如果需要本地安裝包可以私聊我。首先通過VS的擴展搜索聯機搜索DotTrace,點擊擴展----管理擴展,然後如下圖所示安裝:
然後在鏡像文件點擊安裝即可,我這裏已經安裝了,所以顯示的是Repair,大家安裝的時候可以選擇Install:
安裝好之後可以通過如下方式打開進行分析:點擊擴展------點擊ReSharper-------點擊Profile-------點擊 Run Application Performance Profiling,然後就可以召喚出調試選項啦,我這裏使用的本地IIS站點調試,當然也可以直接附加到對應的進程上調試。
點擊run之後刷新站點頁面,將站點host到本地,準備好之後點擊start開啓分析,分析完成後點擊Get Snapshot and Wait ,讀取快照信息:
當然還有一種方式,直接在單元測試上就可以開啓分析:
DotTrace參數說明
在上圖的使用說明中,我們可以看到如下幾個參數,我比較推薦Tracing和Line-by-Line,其實就比較夠用了。
Profiler Options | 作用與描述 | 場景分析 |
---|---|---|
Sampling | 通過獲取 CLR 內部一個方法開始執行和結束執行的時間差來計算的分析時間。這是最快的方法,它用於精確測量程序運行時間,但可能會丟失一些數據。使用此配置類型可使你快速獲取應用程序的的總體性能。 | 這適用於大多數場景。尤其是如果你還沒有對你的程序進行過任何性能分析的情況下,先使用這個選項進行一個初步分析大致確定性能問題是很方便的。 |
Tracing | 慢於 Sampling 的方法,但是可以準確地測量特定方法被調用的準確次數。它是通過獲取 CLR 內部一個方法開始執行和結束執行的時間差來計算的分析時間。 | 如果你使用 Sampling 分析方式得不到你想要的性能分析數據的時候,你可能用得到此選項。例如,當你分析算法複雜度,需要明確知道方法的調用次數,而不需要知道方法的準確執行時間的時候。 |
Line-by-line | 通過收集代碼執行的每條語句的時間來進行比較,它計算出的時間更加精確。該方法適用於你已經知道性能問題大概在哪裏出現,並要找到具體某一個出現性能問題的時候。 | 當你已經通過其他方法得知性能問題出現在哪個具體的方法時你可能需要用到這個選項,這會分析此方法的每一行代碼。 |
Timeline | 採取抽樣的方式,每隔一段時間 (10 ms),會暫停所有線程,並抓取堆棧裏的信息,然後才計算出代碼執行時間差。使用這個方式可能會導致一些執行時間少於 10 ms 的方法無法被抓取到。 | 推薦用於大多數情況,尤其是分析多線程應用程序的時候。你可以用這個選項來確定 UI 卡頓或不響應的原因,可以分析過多的 GC(垃圾回收),可以分析不均勻的工作負載分配、IO 不足或者其他各種異常。 |
DotTrace實踐
接下來就來分別分析下代碼慢的問題,由於涉及到公司的代碼,不便使用其快照信息,我們自己寫個單元測試看看它的性能怎麼樣。
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace UnitTestProject1
{
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
var result = 0;
for (var i = 0; i < 1000; i++)
{
result += i + 10;
}
for (var i = 0; i < 10000; i++)
{
result = GetDouble(result);
}
Assert.IsNotNull(result);
}
public int GetDouble(int single)
{
return single * 2;
}
}
}
點擊分析後獲取到快照,然後在快照裏搜索我們想要的方法:
搜索該方法,我們就可以看到該方法以及其調用的方法鏈中各個方法的調用時間,甚至能直接對比到每一行的代碼性能損耗:
因爲我們這個是比較簡單的單元測試,所以前後耗時不過1毫秒。
當然我們選中方法,右擊屬性還可以看到具體單次調用時間,可以看到單次調用不過1us,可以說快的飛起。
寫在最後
剛開始用這個工具玩兒的特別開心,感覺能透過表層直接看到本質,可以直接越過現象發現本質問題,項目中分析出了兩個淺層不易發現的問題很開心,就像治病救人一樣hhhh。發現jetbrains全家桶真的太強了,大佬說性能調優是邁向高階開發的第一步,希望能越走越遠吧。