其實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提供的性能分析,它真的可以幫你分析到很多你想要的東西。
