先看console代碼(源代碼下載):
static void Main(string[] args) { int i = 10000; while(i-->0) { Core c=new Core(); c.Process(DateTime.Now.ToString()); } }public class Core { public void Process(string input) { //process logic string result = string.Format("{0}-{1}", DateTime.Now, input); //log to file Log(result); } public void Log(string message) { string fileName = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log.txt"); string msg = "{Now}: {Message}"; msg = msg.Replace("{Now}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); msg = msg.Replace("{Message}", message); using (StreamWriter sw = System.IO.File.AppendText(fileName)) { sw.WriteLine(msg); sw.Flush(); sw.Close(); } } }
進(jìn)行初次分析性能,操作步驟如下:
點(diǎn)擊“完成”按鈕,此時(shí)會(huì)自動(dòng)進(jìn)行分析,直接跑完控制臺(tái)程序,vs2012會(huì)自動(dòng)顯示出分析報(bào)告,如下:
從上面的“摘要”報(bào)告中得知
報(bào)告視圖種類:
生成的報(bào)告視圖有很多種,上面所示默認(rèn)的是“摘要”視圖,其他類型的視圖如下所列:
那么我們?nèi)绾胃欉@幾個(gè)耗時(shí)的函數(shù)呢?我們需要轉(zhuǎn)入“函數(shù)詳細(xì)信息”視圖,如下:
右邊紅框代表耗時(shí)分布比例,顯然上圖中Process函數(shù)占用了很大比例
下邊的紅框代表相應(yīng)的代碼,并且還會(huì)紅色高亮性能損耗突出的代碼行、以及相應(yīng)損耗比例(圖中的99.2%是由于這行代碼共有3個(gè)損耗點(diǎn):83.3%+14.4%+1.5%)
我們需要往下跟蹤,進(jìn)入最嚴(yán)重的process函數(shù)進(jìn)行查看,我們click右邊紅框中的Process條,進(jìn)入細(xì)化的分析界面,如下:
看來主要問題來自"Log(result)"代碼行,占了73.5%,繼續(xù)深入跟蹤,如下圖:
這下差不多了,這里比較損耗多的2行是:獲得fileName和AppendText到日志文件代碼行,分別優(yōu)化:
修改代碼如下:
public class Core { public void Process(string input) { //process logic string result = string.Format("{0}-{1}", DateTime.Now, input); //log to file Log(result); } private static List<string> log = new List<string>(); public static void Log(string message)//fileName去掉了,因?yàn)榇藭r(shí)已經(jīng)不需要這個(gè)變量了,因?yàn)槭怯善渌€程負(fù)責(zé)寫入磁盤 { string msg = "{Now}: {Message}"; msg = msg.Replace("{Now}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); msg = msg.Replace("{Message}", message); log.Add(msg); } }
我們?cè)俅芜\(yùn)行性能分析,如下:
我們比較下第一次和這一次的曲線圖:
改進(jìn)后的性能明顯好于改進(jìn)之前的性能。
自定義性能分析
我們可以通過修改屬性來add/remove性能指標(biāo),比如要加入某個(gè)/某些Windows計(jì)數(shù)器、收集Windows事件、收集.NET對(duì)象生命周期等,我們可以進(jìn)行如下操作來進(jìn)行設(shè)置:
將會(huì)生成如下更詳細(xì)的報(bào)告:
報(bào)告中會(huì)列出生成的最多的是哪種對(duì)象(本例中是string)、由哪些函數(shù)導(dǎo)致的分配了最多的內(nèi)存、等等
在“標(biāo)記”視圖中,能看到每隔500毫秒收集的windows計(jì)數(shù)器數(shù)據(jù),如下圖就是磁盤隊(duì)列計(jì)數(shù)器的收集:
在“對(duì)象生存期”視圖中,能看到各種對(duì)象從new到dispose的所有數(shù)據(jù),如下圖:
很牛b吧。
下面說說如何通過VS2012來對(duì)獨(dú)立運(yùn)行的程序進(jìn)行性能分析,其實(shí)很簡(jiǎn)單,就下面這個(gè)圖就搞定了,大家都懂的:
聯(lián)系客服