Views: 0
有陣子常接到要解決網站的效能問題
簡單的總結出心得
策略概述
- 找出瓶頸
- 鬆綁瓶頸
如何找出瓶頸 → 使用量測,測試各個環節的執行速度
鬆綁瓶頸 → 不改變結果的情況下重構程式增進效能。
鬆綁後會有新的瓶頸(就是另一個造成緩慢的問題),再去重複找出與鬆綁瓶頸的過程。
鬆綁瓶頸的策略
資料庫
- 建立正確的索引欄位,尤其是要Join的識別欄位要設定索引。
- 減少查詢次數,例如:建快取、避免碎片化的查詢。
- 減少每次查詢返回資料筆數,例如不要用 Where In 。
- 減少返回的資料欄位,只撈用的到的欄位
- 定時重整索引。
- 調整資料庫結構,進行正規化或反正規化。
- 減少Trigger,盡量不要使用。
- 刪除錯誤的索引。
- 盡量不在DB端處理資料,例如Convert , Case When….
- 減少子查詢、Join。
- 不要用Like查詢
- 查詢有是否存在時使用
Select Top 1 1 From [table] Where ...
不要使用Count > 0
程式面
- 可以的話先不去動原始程式,另外寫一個重構後的,新舊程式可以使用單元測試驗證輸出入結果,後續最佳化時候再刪除舊版的程式。
- 減少記憶體複製的動作,例如 var a = b ,ToList()。
- 為重複使用的資料建立快取。
- 盡量使用C#有提供的函數處理資料,例如Contain會比IndexOf 效率好。
- 使用強型別,例如:DataTable改用List
,強型別處理資料會比弱型別快很多。 - for改用foreach。
- 改成非同步執行。
- 使用多執行緒。
- 減少轉型。
- 大量組合字串使用StringBuilder ,不使用字串相加。
- 使用SQL指令使用Const String,不要去組合字串,效能會變很差。
- 職責分離,拆解大物件中與職責不相干的方法,移除不相關的欄位,如果類別很肥大,每次建構都後都會佔用大量記憶體,資料回收後也會佔用大量系統資源。
- 解耦循環參照的類別。
- 改用依賴注入與資源管理器。
- 使用資源管理器限制每個查詢連線數。
- 使用抽象與介面改寫。
- 資源要確實回收,實做Dispose模式,並在Using呼叫它。
- 使用單元測試測量改善前後執行狀況。
- 減少boxing跟unboxing。
- 減少產生的變數,刪除用不到的變數,這樣可以減少資源分配與回收耗掉的效能。
- 使用Nlog取代自己寫的Log工具。
- 善用建構式與Readonly屬性
- 以Release設定編譯程式。
0 Comments