建構高性能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<T>。它可以使得我們定義事先定義一個對象,知道需要的時候才執行個體化它。如下:
Lazy<ExpensiveObject> expensiveObject = new Lazy<ExpensiveObject>();
通過以下語句在需要時,擷取這個對象:
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 < 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 ,如需轉載請自行聯系原作者