關(guān)于VS2012自帶的 性能分析 工具使用實例(圖文介紹)
本篇通過一小段代碼的console程序來進(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();
}
}
}

點擊“完成”按鈕,此時會自動進(jìn)行分析,直接跑完控制臺程序,vs2012會自動顯示出分析報告,如下:
從上面的“摘要”報告中得知
- System.IO.File.AppendText函數(shù)和System.AppDomain.get_BaseDirectory函數(shù)耗時最多,我們需要先優(yōu)化這2個函數(shù)的使用(稍后再講)共列出了最耗時的5個函數(shù)
報告視圖種類:
生成的報告視圖有很多種,上面所示默認(rèn)的是“摘要”視圖,其他類型的視圖如下所列:
那么我們?nèi)绾胃欉@幾個耗時的函數(shù)呢?我們需要轉(zhuǎn)入“函數(shù)詳細(xì)信息”視圖,如下:
右邊紅框代表耗時分布比例,顯然上圖中Process函數(shù)占用了很大比例
下邊的紅框代表相應(yīng)的代碼,并且還會紅色高亮性能損耗突出的代碼行、以及相應(yīng)損耗比例(圖中的99.2%是由于這行代碼共有3個損耗點: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)化:
- 獲得文件名優(yōu)化日志文件名是不變的,因此不用每次Log(msg)都要計算,直接extract為static的fileName變量AppendText優(yōu)化一旦牽涉到I/O操作,速度就慢,無法避免(從單行代碼的角度來看),那怎么辦?那就把結(jié)構(gòu)改掉吧:主程序?qū)懭雔og到隊列中,由另外一個thread負(fù)責(zé)寫入到磁盤中
修改代碼如下:
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去掉了,因為此時已經(jīng)不需要這個變量了,因為是由其他線程負(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);
}
}

我們比較下第一次和這一次的曲線圖:
改進(jìn)后的性能明顯好于改進(jìn)之前的性能。
自定義性能分析
我們可以通過修改屬性來add/remove性能指標(biāo),比如要加入某個/某些Windows計數(shù)器、收集Windows事件、收集.NET對象生命周期等,我們可以進(jìn)行如下操作來進(jìn)行設(shè)置:
將會生成如下更詳細(xì)的報告:
報告中會列出生成的最多的是哪種對象(本例中是string)、由哪些函數(shù)導(dǎo)致的分配了最多的內(nèi)存、等等
在“標(biāo)記”視圖中,能看到每隔500毫秒收集的windows計數(shù)器數(shù)據(jù),如下圖就是磁盤隊列計數(shù)器的收集:
在“對象生存期”視圖中,能看到各種對象從new到dispose的所有數(shù)據(jù),如下圖:
很牛b吧。
下面說說如何通過VS2012來對獨立運行的程序進(jìn)行性能分析,其實很簡單,就下面這個圖就搞定了,大家都懂的:
再說說如何對web項目性能分析吧...
先打開web項目解決方案,然后直接進(jìn)行性能分析,有人會說沒有請求操作啊,這個簡單,有多個解決辦法:
再開一個VS環(huán)境(無論是遠(yuǎn)程的還是本地的),通過web負(fù)載測試來瘋狂請求通過loadrunner/qtp來模擬請求悲催的人工請求...- VisualStudio 2008中常用快捷鍵
- 使用VisualStudio開發(fā)php的圖文設(shè)置方法
- vs.net 2010 擴(kuò)展插件小結(jié) 提高編程效率
- 解析VS2010利用VS.PHP插件調(diào)試PHP的方法
- VisualStudio 使用Visual Leak Detector檢查內(nèi)存泄漏
- VS2015 免費插件Refactoring Essentials
- .NET Visual Studio 代碼性能分析工具
- Visual Studio 2010 前端開發(fā)工具/擴(kuò)展/插件推薦
- 最鋒利的Visual Studio Web開發(fā)工具擴(kuò)展:Web Essentials使用詳解
相關(guān)文章
ASP.NET 根據(jù)漢字獲取漢字拼音的首字母(含多音字)
本文分享了一個函數(shù),這個函數(shù)可以根據(jù)漢字的字符串獲取其拼音的首字母,以便我們在實際開發(fā)中使用。2016-04-04詳解在Azure上部署Asp.NET Core Web App
這篇文章主要介紹了詳解在Azure上部署Asp.NET Core Web App,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12asp.net core mvc實現(xiàn)偽靜態(tài)功能
這篇文章主要為大家詳細(xì)介紹了asp.net core mvc實現(xiàn)偽靜態(tài)功能的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-02-02asp.net實現(xiàn)取消頁面表單內(nèi)文本輸入框Enter響應(yīng)的方法
這篇文章主要介紹了asp.net實現(xiàn)取消頁面表單內(nèi)文本輸入框Enter響應(yīng)的方法,結(jié)合實例形式分析了asp.net文本框Enter響應(yīng)的原理與取消Enter響應(yīng)的相關(guān)實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-11-11ASP.NET MVC使用ActionFilterAttribute實現(xiàn)權(quán)限限制的方法(附demo源碼下載)
這篇文章主要介紹了ASP.NET MVC使用ActionFilterAttribute實現(xiàn)權(quán)限限制的方法,結(jié)合實例形式分析了ASP.NET MVC使用ActionFilterAttribute過濾類實現(xiàn)權(quán)限限制的步驟與相關(guān)技巧,并附帶demo源碼供讀者下載,需要的朋友可以參考下2016-04-04Asp.net core利用MediatR進(jìn)程內(nèi)發(fā)布/訂閱詳解
這篇文章主要給大家介紹了關(guān)于Asp.net core利用MediatR進(jìn)程內(nèi)發(fā)布/訂閱的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Asp.net core具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06ASP.NET Core擴(kuò)展庫之Http通用擴(kuò)展庫的使用詳解
這篇文章主要介紹了ASP.NET Core擴(kuò)展庫之Http通用擴(kuò)展庫的使用詳解,幫助大家更好的理解和學(xué)習(xí)使用.net技術(shù),感興趣的朋友可以了解下2021-04-04Asp.net內(nèi)置對象之Cookies(簡介/屬性方法/基本操作及實例)
本文將圍繞cookies了解Cookies對象/Cookie對象的屬性和方法/Cookie的基本操作及實例:Cookie的寫入和讀取/Cookie對象相比Session、Application的優(yōu)缺點扥等,感興趣的朋友可以了解下,或許對你學(xué)習(xí)cookies有所幫助2013-02-02