關(guān)于VS2012自帶的 性能分析 工具使用實(shí)例(圖文介紹)
本篇通過(guò)一小段代碼的console程序來(lái)進(jìn)行性能的分析以及改進(jìn)、直到后面的改進(jìn)前、改進(jìn)后性能比較結(jié)果。
先看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();
}
}
}

點(diǎn)擊“完成”按鈕,此時(shí)會(huì)自動(dòng)進(jìn)行分析,直接跑完控制臺(tái)程序,vs2012會(huì)自動(dòng)顯示出分析報(bào)告,如下:
從上面的“摘要”報(bào)告中得知
- System.IO.File.AppendText函數(shù)和System.AppDomain.get_BaseDirectory函數(shù)耗時(shí)最多,我們需要先優(yōu)化這2個(gè)函數(shù)的使用(稍后再講)共列出了最耗時(shí)的5個(gè)函數(shù)
報(bào)告視圖種類(lèi):
生成的報(bào)告視圖有很多種,上面所示默認(rèn)的是“摘要”視圖,其他類(lèi)型的視圖如下所列:
那么我們?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ì)化的分析界面,如下:
看來(lái)主要問(wèn)題來(lái)自"Log(result)"代碼行,占了73.5%,繼續(xù)深入跟蹤,如下圖:

這下差不多了,這里比較損耗多的2行是:獲得fileName和AppendText到日志文件代碼行,分別優(yōu)化:
- 獲得文件名優(yōu)化日志文件名是不變的,因此不用每次Log(msg)都要計(jì)算,直接extract為static的fileName變量AppendText優(yōu)化一旦牽涉到I/O操作,速度就慢,無(wú)法避免(從單行代碼的角度來(lái)看),那怎么辦?那就把結(jié)構(gòu)改掉吧:主程序?qū)懭雔og到隊(duì)列中,由另外一個(gè)thread負(fù)責(zé)寫(xiě)入到磁盤(pán)中
修改代碼如下:
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é)寫(xiě)入磁盤(pán)
{
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);
}
}

我們比較下第一次和這一次的曲線圖:

改進(jìn)后的性能明顯好于改進(jìn)之前的性能。
自定義性能分析
我們可以通過(guò)修改屬性來(lái)add/remove性能指標(biāo),比如要加入某個(gè)/某些Windows計(jì)數(shù)器、收集Windows事件、收集.NET對(duì)象生命周期等,我們可以進(jìn)行如下操作來(lái)進(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ù),如下圖就是磁盤(pán)隊(duì)列計(jì)數(shù)器的收集:
在“對(duì)象生存期”視圖中,能看到各種對(duì)象從new到dispose的所有數(shù)據(jù),如下圖:
很牛b吧。
下面說(shuō)說(shuō)如何通過(guò)VS2012來(lái)對(duì)獨(dú)立運(yùn)行的程序進(jìn)行性能分析,其實(shí)很簡(jiǎn)單,就下面這個(gè)圖就搞定了,大家都懂的:
再說(shuō)說(shuō)如何對(duì)web項(xiàng)目性能分析吧...
先打開(kāi)web項(xiàng)目解決方案,然后直接進(jìn)行性能分析,有人會(huì)說(shuō)沒(méi)有請(qǐng)求操作啊,這個(gè)簡(jiǎn)單,有多個(gè)解決辦法:
再開(kāi)一個(gè)VS環(huán)境(無(wú)論是遠(yuǎn)程的還是本地的),通過(guò)web負(fù)載測(cè)試來(lái)瘋狂請(qǐng)求通過(guò)loadrunner/qtp來(lái)模擬請(qǐng)求悲催的人工請(qǐng)求...- VisualStudio 2008中常用快捷鍵
- 使用VisualStudio開(kāi)發(fā)php的圖文設(shè)置方法
- vs.net 2010 擴(kuò)展插件小結(jié) 提高編程效率
- 解析VS2010利用VS.PHP插件調(diào)試PHP的方法
- VisualStudio 使用Visual Leak Detector檢查內(nèi)存泄漏
- VS2015 免費(fèi)插件Refactoring Essentials
- .NET Visual Studio 代碼性能分析工具
- Visual Studio 2010 前端開(kāi)發(fā)工具/擴(kuò)展/插件推薦
- 最鋒利的Visual Studio Web開(kāi)發(fā)工具擴(kuò)展:Web Essentials使用詳解
相關(guān)文章
詳解如何創(chuàng)建一個(gè).NET Core工程
本文主要介紹了如何創(chuàng)建一個(gè).NET Core工程,文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
asp.net利用Ajax和Jquery在前臺(tái)向后臺(tái)傳參數(shù)并返回值的實(shí)例
asp.net利用Ajax和Jquery在前臺(tái)向后臺(tái)傳參數(shù)并返回值的實(shí)例,需要的朋友可以參考一下2013-05-05
水晶報(bào)表圖片不顯示兩種問(wèn)題分析及解決方法
水晶報(bào)表布置后里面的圖片不顯示的情況,分兩種:一是:水晶報(bào)表工具欄上的圖片不顯示;二是:水晶報(bào)表中的的圖片對(duì)象不顯示,接下來(lái)將分別介紹解決方法,感興趣的朋友可以了解下啊2013-01-01
asp.net開(kāi)發(fā)微信公眾平臺(tái)之驗(yàn)證消息的真實(shí)性
這篇文章主要介紹了asp.net開(kāi)發(fā)微信公眾平臺(tái)之驗(yàn)證消息的真實(shí)性的相關(guān)資料,需要的朋友可以參考下2015-06-06
基于.NET程序默認(rèn)啟動(dòng)線程數(shù)講解
本篇文章小編為大家介紹,基于.NET程序默認(rèn)啟動(dòng)線程數(shù)講解。需要的朋友參考下2013-04-04
asp.net下獲取遠(yuǎn)程網(wǎng)頁(yè)的內(nèi)容之二(downmoon原創(chuàng))
asp.net下獲取遠(yuǎn)程網(wǎng)頁(yè)的內(nèi)容之二(downmoon原創(chuàng))...2007-04-04
.Net平臺(tái)開(kāi)發(fā)實(shí)踐的一些點(diǎn)滴總結(jié)(技術(shù)規(guī)范與實(shí)踐精華)
以下是本人對(duì).Net平臺(tái)開(kāi)發(fā)實(shí)踐的一些點(diǎn)滴總結(jié)。這里的技術(shù)規(guī)范主要是開(kāi)發(fā)過(guò)程的代碼規(guī)范、數(shù)據(jù)庫(kù)設(shè)計(jì)規(guī)范、Com和.Net互操作規(guī)范;實(shí)踐精華是對(duì)技術(shù)實(shí)踐過(guò)程中的部分總結(jié)。2010-04-04

