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