通過VS2010的內存分析工具來分析程序性能問題


  其實VS已經提供基於CPU占用情況的性能分析功能,但它並不能什么情況都能分析出來。當你發現mscorwks.dll這玩意占用着大量的資源,確無法點擊進去的看具體情況的時候有可能會感到無能為力,也許已經盡力了那些.net framework的事情管不了。其實mscorwks.dll的損耗和我們編寫的代碼有着緊密的聯系,我們可以通過VS的內在分析工作看下代碼的內存分配狀況然后再查找問題。

  打開性能分析向導

選擇內存分配采樣即可。

運行后會產以下的結果圖:

圖中可以看到占用字節最多的方法和分配最多字節的類型,我們可以點擊內存分配最多的類型看下詳細列表

在這里我們可以看到byte[]和char[]分配了大量的內存,而這些通過cpu性能分析是看不到的,而這些對像的創建和銷毀都會使用的資源的。我們可以點擊一下看這些內存分配是那里產生的。

從上面的圖可以看到byte[]的分配主要是來源於池的初始化,既然是必須的就不用考慮那是必須做的。再來看下char[]來源於每次寫入的Encoding.Getbytes里的string.ToCharArray();反編譯看下代碼情況:

// System.Text.Encoding
public virtual byte[] GetBytes(string s)
{
	if (s == null)
	{
		throw new ArgumentNullException("s", Environment.GetResourceString("ArgumentNull_String"));
	}
	char[] array = s.ToCharArray();
	return this.GetBytes(array, 0, array.Length);
}

// string
public unsafe char[] ToCharArray()
{
	int length = this.Length;
	char[] array = new char[length];
	if (length > 0)
	{
		fixed (char* ptr = &this.m_firstChar)
		{
			fixed (char* ptr2 = array)
			{
				string.wstrcpyPtrAligned(ptr2, ptr, length);
			}
		}
	}
	return array;
}

從代碼可以看到原因所在,因為GetBytes需要一個char[],而string每次獲取char[]都是返回一個新提char[]對象。其實這兩個對象都提供基於char[]操作和copy的到char[]的方法。仔細看下MSDN你就能找到你想要的:)這里我就不多說了。

調整一下代碼后的分析結果又怎樣呢?

調整一下char[]的分配一下子就少了:)創建的對象少了,分配的內存少了,那內存回收就不用說了。

如果有朋友苦於找不到程序的性能問題,不防可以試下VS提供的性能分析,它真的可以幫你分析到很多你想要的東西。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM