天天看點

.NET性能分析最佳實踐之:如何找出使用過多記憶體的.NET代碼(基礎篇)

 .NET性能分析最佳實踐之:如何找出使用過多記憶體的.NET代碼(基礎篇)

       在.NET應用中一個常常影響性能的因素就是代碼消耗了過多的記憶體。很多的開發人員在編寫代碼的過程中常常不會關注性能,進而使得應用程式中到處存在性能瓶頸。很多的時候,開發人員關注的總是代碼的執行時間的長短,而把真正的性能問題丢掉了一邊。在本篇文章中,我們将會找出代碼中的哪些功能消耗了多少記憶體。

本篇文章比較簡單,我們會主要詳細的介紹CLR Profiler這個工具。

 系列文章:

本篇議題如下:

基礎篇:詳解介紹Profiler的使用

進階篇:調用Profiler的API進行

首先我們來介紹一下CLR Profiler的功能。

       CLR Profiler确實是一個不錯的工具,通過使用它,我們可以了解一個.NET應用程式到底是如何使用記憶體的,基本上面它的功能可以分為兩類,如圖所示:

<a href="http://www.agilesharp.com/Services/BlogAttachment.ashx?AttachmentID=236" target="_blank"></a>

1. 對一個.NET應用中的記憶體是如何配置設定的給出一個完整的描述。是以,我們可以看到每一種類型,方法所占用的記憶體情況。

2. 它告訴我們一個方法被調用了多少次。

       這裡需要注意的就是:不要再生産環境或上面的伺服器站點中運作CLR Profiler,因為它會嚴重的影響程式的影響。例如,如果我們的應用程式中包含兩個方法,fun1和fun2,此時當我們運作CLR Profiler的時候,它會将一些邏輯注入到應用程式中,通過下面的一個圖就可以很清楚的看出這個問題:

<a href="http://www.agilesharp.com/Services/BlogAttachment.ashx?AttachmentID=237" target="_blank"></a>

說了這麼多,我們還是來看看,如何使用CLR Profiler。

       首先,在使用CLR Profiler之前,我們要清楚:要使用這個工具來幹嘛?基本上,有兩點理由:檢視記憶體的配置設定與使用的情況;檢視方法被調用次數。

啟動了CRLProfiler.exe之後,選擇要檢查的程式,如下圖:

<a href="http://www.agilesharp.com/Services/BlogAttachment.ashx?AttachmentID=238" target="_blank"></a>

此時,應用程式就開始運作,我們就可以在Profiler中看到一些資訊,例如應用程式占用的内容,每一代對象占用的大小等,如下:

       其實上面的那個應用程式非常的簡單,隻是作為一個demo示範而言。上面的程式的功能就是在一個按鈕的事件中調用了兩個方法:UseSimpleStrings和UseStringBuilders。這個兩個方法都是在拼接字元串(這也是常常被用來做例子的一個場景),我們分别讓它們拼接1000個字元串,如下:

<a href="http://www.agilesharp.com/Services/BlogAttachment.ashx?AttachmentID=240" target="_blank"></a>

其中UseSimpleStrings如下:

<a href="http://www.agilesharp.com/Services/BlogAttachment.ashx?AttachmentID=241" target="_blank"></a>

UseStringBuilders如下:

<a href="http://www.agilesharp.com/Services/BlogAttachment.ashx?AttachmentID=242" target="_blank"></a>

       現在,我們可以嘗試着使用Profiler去看看每個方法使用多少的記憶體。我們在程式中點選按鈕,好讓Profiler去收集資訊。然後,我們在點選Profiler的“histogram”按鈕,此時我們就可以看到程式中的每一種類型的記憶體占用情況,如下:

<a href="http://www.agilesharp.com/Services/BlogAttachment.ashx?AttachmentID=243" target="_blank"></a>

如果我們想看每一個方法在運作過程中占用的内容,可以點選“Allocation Graph”,如下:

<a href="http://www.agilesharp.com/Services/BlogAttachment.ashx?AttachmentID=244" target="_blank"></a>

通過這個操作,我們可以看到下面的圖:

<a href="http://www.agilesharp.com/Services/BlogAttachment.ashx?AttachmentID=245" target="_blank"></a>

       乍一看,可能感覺界面非常的混亂,特别是在應用程式很大的時候。為了更加看到我們想看的方法,我們可以通過在界面的中點選右鍵,點選“Find Routine”,然後選擇輸入過濾的條件,如下:

<a href="http://www.agilesharp.com/Services/BlogAttachment.ashx?AttachmentID=246" target="_blank"></a>

這樣就可以快速的定位,如下:

<a href="http://www.agilesharp.com/Services/BlogAttachment.ashx?AttachmentID=247" target="_blank"></a>

然後在方法上面輕按兩下,就進一步的展開,檢視細節,如下:

<a href="http://www.agilesharp.com/Services/BlogAttachment.ashx?AttachmentID=248" target="_blank"></a>

       在上圖中,我們隻是看到了“UseSimpleStrings”方法的使用記憶體的情況,因為這個界面顯示的資訊比較的粗糙,隻是把一些記憶體使用比較多的方法列出來了,我們可以通過點選“0(everything)”檢視是以的方法,此時看到如下:

<a href="http://www.agilesharp.com/Services/BlogAttachment.ashx?AttachmentID=249" target="_blank"></a>

通過上面的圖,我們一目了然的直到記憶體的使用情況。

本文轉自yanyangtian51CTO部落格,原文連結: http://blog.51cto.com/yanyangtian/830456,如需轉載請自行聯系原作者

繼續閱讀