常用的效能最佳化方法

柒墨轩發表於2024-07-18

效能最佳化是程式設計師工作必備的技能,下面分享一些經典的效能最佳化思路和方法。

首先明確效能最佳化的定義和目標。效能最佳化是指透過 持續的 分析、實踐和測試,確保系統穩定高效執行,從而滿足使用者的訴求。

效能最佳化閉環:

效能最佳化分類

一般情況下,我們把效能最佳化分為 2 大類:
1)通用最佳化
是指一些經典的、對於絕大多數情況都適用的最佳化策略。比如增大伺服器的併發請求處理數、使用快取減少資料庫查詢、透過負載均衡分攤請求、同步轉非同步等。

2)對症下藥
是指結合具體的業務特性和系統現狀,先透過效能監控工具、壓力測試等方式,分析出系統的效能瓶頸,再針對性地選取策略進行最佳化。
比如資料庫單次查詢超過 1 秒,屬於慢查詢,根據實際的查詢條件給對應的欄位增加索引,一般就能提高查詢效能。

實際開發中,這兩類效能最佳化策略通常都要使用。在系統設計和開發階段,我們要根據自己的經驗,本能地引入一些效能最佳化的手段,降低後續系統出現問題、需要迭代最佳化的機率。此外,效能最佳化一定是持續的,隨著需求、使用者、系統用量的增多,原本效能符合要求的系統也可能會出現各種新的問題,很難面面俱到、一步到位。

但是,對於複雜的、對可用性和穩定性要求極高的專案,我們可以提前透過壓力測試來模擬使用者量極大的情況,並提前做好效能最佳化和應對措施。

通用效能最佳化手段

有哪些通用的效能最佳化手段呢?
我們以一個請求的完整生命週期為例,依次去介紹。
通常,使用者從傳送請求,到最終得到資料,要分別經過以下節點:

每個節點,我們都有對應的最佳化方法:
1)前端:
  ●離線快取:利用瀏覽器的快取機制,請求過一次的資源就不用重複請求,提高頁面載入速度。
  ●請求合併:頁面請求過多時,將多個小請求合併成一個大請求,減少網路開銷。
  ●懶載入:延遲載入頁面的圖片等元素,提高首屏載入速度。
2)閘道器:
  ●負載均衡:負責接受請求,根據一定的路由演算法轉發到對應的後端系統,實現多個後端伺服器分攤請求,增大併發量。
  ●快取:將後端返回的資料進行快取,下次前端請求時,直接從閘道器獲取資料,減少後端呼叫、提高資料獲取速度。
3)後端請求層:
  ●伺服器最佳化:根據業務特性,選擇效能更高的伺服器並調整引數,比如 Nginx、Undertow 等。
  ●微服務:將大型服務拆分為小型服務,並透過微服務閘道器進行轉發,增大各服務的併發處理能力。
4)業務邏輯層:
  ●非同步化:將同步的業務邏輯改為非同步,儘早響應,提高併發處理能力。
  ●多執行緒:將複雜的操作拆分成多個任務,透過多執行緒併發執行,提高任務處理效率。
5)中介軟體(第三方依賴):
  ●快取:將資料庫查詢出的結果資料快取到效能更高的服務(比如基於記憶體的 Redis 或本地),減少資料庫的壓力、並提高資料查詢效能。
  ●佇列:使用訊息佇列,對系統進行解耦、或者將操作非同步化,實現流量的削峰填谷。
6)儲存層:
  ●分庫分表:資料量極大時,對資料庫進行垂直或水平切分,提高資料庫併發處理能力。
  ●資料清理:定期清理無用或過期的資料,減少儲存壓力,必要時可以對資料進行備份轉儲。

雖然有那麼多效能最佳化方法,但並不是每一種都要用、每一種都有用。在做效能最佳化時,一定要根據實際情況,權衡價效比和系統改動風險,並且做好充分的測試,不要好心最佳化、結果給系統匯入了新的 Bug。而且一般情況下,不建議大家為了最佳化盲目引入新技術,先從成本最低的最佳化方法開始。
舉個例子,你在本地使用 Elasticsearch 最佳化了查詢效能,但是公司根本沒有成本採購 Elasticsearch,這就脫離了實際情況。
大家先了解這些方法,日後做效能最佳化時能夠想起來就足夠了。

相關文章