分享人:陳孚楠
1. 垃圾回收
.net Framework 自帶的垃圾回收機制。就是會自動判斷對象還有沒有用,沒用的會被回收。而不管對象的創建還是回收都是會消耗性能的,所以要避免不必要的對象創建。
① 避免循環創建。
For(){
Model.X x = DB.X.function();
…..
}
-----------------------------------------------
Model.X x = DB.X.function();;
For(){
…..
}
②在需要邏輯分支中創建對象。
如果一個對象只在一個邏輯分支中用到,那么就把這個對象的創建放在這個邏輯分支內。
Model.X x = new Model.X();
If(){
}
------------------------------------------------
If(){
Model.X x = new Model.X();
}
③ 一次創建,多次使用??臻g分配的問題。
Model.X x =null;
For(){
x = new Model.X();
…..
}
----------------------------
For(){
Model.X x = new Model.X();
…..
}
2. String 操作
使用 StringBuilder 做字符串連接
String 是不變類,使用 + 操作連接字符串將會導致創建一個新的字符串。如果字符串連接次數不是固定的,例如在一個循環中,則應該使用StringBuilder 類來做字符串連接工作。因為 StringBuilder 內部有一個 StringBuffer ,連接操作不會每次分配新的字符串空間。只有當連接后的字符串超出 Buffer 大小時,才會申請新的 Buffer 空間。典型代碼如下:
StringBuilder sb = new StringBuilder( 256 );
for ( int i = 0 ; i < Results.Count; i ++ )
{
sb.Append (Results[i]);
}
如果連接次數是固定的并且只有幾次,此時應該直接用 + 號連接,保持程序簡潔易讀。實際上,編譯器已經做了優化,會依據加號次數調用不同參數個數的 String.Concat 方法。例如:String str = str1 + str2 + str3 + str4;
會被編譯為 String.Concat(str1, str2, str3, str4)。該方法內部會計算總的 String 長度,僅分配一次,并不會如通常想象的那樣分配三次。作為一個經驗值,當字符串連接操作達到 10 次以上時,則應該使用 StringBuilder。
使用最快的空串比較方法
- 將String對象的Length屬性與0比較是最快的方法:if (str.Length == 0)。
- 其次是與String.Empty常量或空串比較:if (str == String.Empty)或if (str == "")。
3. 算法優化
一般遇到的性能較差的原因是:數據較多導致循環次數多或者循環體里多次使用DB查詢數據。
總的來說就是一個函數跑玩需要成千上萬次的訪問數據庫。這時我門就需要數據字典這類東西了。就是在循環之前把循環里多次要訪問的數據表一次性查出來(盡量的加上限制條件)
原因:
- 首先,跑內存是比跑硬盤要快的。 數據庫是在硬盤上,更可能在別人的電腦硬盤上。而數組是在自己的電腦內存里。
- 數據庫連接的打開和關閉是很耗時間的。就像在我們循環向數據表插入數據的時候應當用SqlPackage 最后一次性將所有sql語句放到數據庫執行,而不是產生一個就DB.Add()一個。
當然,在跑數組的時候,也要盡量優化。比如:在循環的執行體里多加些限制,那么有些語句跑的次數會被減少;還有就是熟練的使用break等,避免不必要的后續循環。
以上很多都是我個人理解,如有錯誤,請多指正!