天天看點

建構高性能ASP.NET站點 第七章 如何解決記憶體的問題(後篇)—托管資源優化—監常用優化措施

建構高性能ASP.NET站點 第七章 如何解決記憶體的問題(後篇)—托管資源優化—監常用優化措施

<b> </b>

前言:有段時間沒有寫這個系列了,希望大家見諒,本篇主要将會介紹一些常用的CLR優化措施.

本篇的議題如下:

<b>記憶體問題概述(</b><b>前篇)</b>

<b>托管資源優化(前篇)</b>

<b>         </b><b>對象的生命周期(前篇)</b>

<b>         </b><b>對象的”</b><b>代“(前篇)</b>

<b>         </b><b>大對象堆(LOH) </b><b>(前篇)</b>

<b>         CLR</b><b>計數器的使用         </b><b>(中篇)</b>

<b>         CLR Profiler</b><b>的使用(中篇)</b>

<b>         </b><b>垃圾回收器的不同版本(中篇)</b>

<b>         </b><b>對象使用注意事項(後篇)</b>

<b>         </b><b>常用優化措施(後篇)</b>

<b>非托管資源優化</b>

<b>Session</b><b>會話的優化</b><b> </b>

<b>對象使用注意事項</b>

   在之前的内容,我們講述了CLR的托管堆的相關知識,同時也講述了CLR的垃圾回收機制,對于對象,言有一點要記住:盡可能晚的創對象。目的是使得對象的“代”盡可能的小,讓沒有必要生存很長時間的對象盡可能早的被回收。

   下面是對象使用的注意事項:

1.  不要過早的建立大對象,然後再很久之後才用,而是在要用的才建立,如下:

不要這樣:

LargeObject largeObject = new LargeObject(); 

// Long running database call ... 

largeObject.MyMethod(); 

而要這樣:

同樣,這個原則也适用于消耗資源很多的對象,例如Transaction事務對象,要盡可能晚的打開事務,盡可能早的關閉事務。

2.  如果在.NET4 中,可以考慮使用Lazy&lt;T&gt;。它可以使得我們定義事先定義一個對象,知道需要的時候才執行個體化它。如下:

Lazy&lt;ExpensiveObject&gt; expensiveObject = new Lazy&lt;ExpensiveObject&gt;(); 

通過以下語句在需要時,擷取這個對象:

expensiveObject.Value; 

3. 對于确定不再需要的對象,盡早的釋放,将其引用設為null,如下:

// Create reference from long lived object to new large object 

longLivedObject.largeObject = largeObject; 

// Reference no longer needed 

longLivedObject.largeObject = null; 

<b>常用優化措施</b>

<b>1. </b><b>使用StringBuilder</b><b>進行字元串拼接</b>

string s = ""; 

for (int i = 0; i &lt; stringArray.Length; i++) 

     s += stringArray[i]; 

要這樣:

StringBuilder sb = new StringBuilder(capacity); 

sb.Append(stringArray[i]); 

string s = sb.ToString(); 

// Concatenation results in new string object 

sb.Append(stringArray[i] + ","); 

要這樣:

sb.Append(","); 

注:

1.如果需要拼接的字元串超過了6個以上,那麼就可以用StringBuilder,如果沒有超過6個,那麼可以直接将其拼接,兩者差別不大。

2. 如果可以知道估算出字元串的長度,可以在使用StringBuilder拼接的時候,盡量的聲明StringBuilder的容量,例如new StringBuilder(1000);因為如果不聲明容量,StringBuilder的預設容量是16,如果字元串過長,那麼CLR會重新為StringBuilder配置設定新的容量和記憶體,把原來的字元串copy過來,這樣,原來的字元串儲存空間就浪費,直到 CLR垃圾回收才釋放。

<b>2.</b><b>使用Compare</b><b>進行字元串的大小比較</b>

比較字元串是否相等的時候,一般如下:

if (s1.ToLower() == s2.ToLower()) 

但是,這樣會更好:

if (string.Compare(s1, s2, true) == 0) 

  因為在Compare方法比較的時候是一個位元組一個位元組的比較,這樣會更快。

<b>3.</b><b>使用Response.Write</b><b>來輸出緩沖</b>

在ASP.NET中,采用Response.Write來講資料發送到浏覽器,

不要采用:

Response.Write(s1 + s2); 

要采用:

Response.Write(s1); 

Response.Write(s2); 

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