c#代碼中影響效能的主要因素
資源的浪費
-記憶體的浪費
-對象的冗餘
-cpu的浪費
拆箱,裝箱
-實值型別與參考型別的轉化
演算法
泛型
c#的泛型支援:類,結構體,介面,委託以及方法成員
c#的泛型可採用"基類,介面,構造器,實值型別/參考型別"的約束方式來實現對型別參數的顯示約束
可以定義型別安全的資料結構
因為防止了拆箱和裝箱,所以可以顯著提高效能
可在支援泛型和擴充方法時,能夠直接對類型使用擴充方法,而不用再反射調用了。
實值型別處理使用泛型比不使用泛型集合效率高很多
參考型別處理用泛型和不使用泛型集合差不多
資料訪問
資料庫連接最晚開啟,最早關閉
盡量使用ExecuteReader來讀取資料
DataTable比用DataSet效能好(除非要儲存關係)
合理使用串連池
適當使用SQLCLR做預存程序
不要忘記DataReader開啟後是需要關閉的
(cmd.ExecuteReader(ConnectionBehavior.CloseConnection); or if (sdr.IsClosed) sdr.Close())
非託管內容需要顯示的去關閉
迴圈
盡量減少迴圈體中設定/初始設定變數
避免在迴圈中修改被便利對象的子項目
在多線程情境中,迴圈執行時適當使用
sleep會提高系統整體效能
避免使用遞迴調用和嵌套迴圈
推薦盡量使用foreach替代for
異常處理
捕獲和拋出異常都是消耗比較大的操作,盡量減少try的次數,避免使用異常來控制處理邏輯
避免引發不必要的異常
捕獲制訂的異常,盡量避免使用異常的基類System.Exception
處理異常時,在finally中釋放佔用的資源(串連,檔案流等)
位元運算
不要忘記位元運算這個效能極高的東東
其它
減少使用輸出參數
避免使用ArrayList,盡量使用泛型列表
部署之前禁用偵錯模式
使用常量避免建立對象(如string.empty替代"")
避免使用空的解構函式
減少類型轉化
如果資料結構符合索引值對的形式,建議使用泛型字典(非泛型情況下用hashtable)
提升i/o速度,並減少i/o數量
若對反射機制不熟悉,應在關鍵模組代碼中避免使用它;
推薦學習使用老趙的FastReflectionLib