Google Cloud Well-Architected Framework 的永續發展支柱包含這項原則,提供相關建議,協助您編寫可減少能源消耗和伺服器負載的軟體。
原則總覽
遵循最佳做法建構雲端應用程式,可盡量減少雲端基礎架構資源 (AI、運算、儲存空間和網路) 的耗電量。此外,您也能協助減少資料中心的水資源需求,以及使用者裝置存取應用程式時消耗的能源。
如要建構節能軟體,您必須在整個軟體生命週期中納入永續發展考量,包括設計、開發、部署、維護和封存。如需使用 AI 建構軟體的詳細指南,盡量減少雲端工作負載對環境的影響,請參閱 Google Cloud 電子書「以永續方式建構軟體」。
建議
本節的建議會依下列重點領域分類:
- 減少運算工作: 盡量使用精簡的程式碼,避免多餘的邏輯,以及不必要的運算或功能膨脹。
- 使用高效率的演算法和資料結構: 選擇可減少 CPU 負載並盡量降低記憶體用量的演算法,以節省時間和記憶體。
- 最佳化運算和資料作業: 開發時,請以有效運用所有可用資源為目標,包括 CPU、記憶體、磁碟 I/O 和網路。舉例來說,以事件驅動邏輯取代忙碌迴圈時,即可避免不必要的輪詢。
- 實作前端最佳化: 如要減少使用者裝置的耗電量,請使用縮小、壓縮和延遲載入圖片和資產等策略。
盡量減少運算工作
如要編寫節能軟體,您必須盡量減少應用程式執行的運算工作總量。每項不必要的指令、多餘的迴圈和額外功能都會耗用能源、時間和資源。請參考下列建議,建構執行最少運算的軟體。
編寫精簡的程式碼
如要編寫最少的必要程式碼,達成所需結果,請使用下列方法:
- 消除多餘的邏輯和功能膨脹:編寫只執行必要功能的程式碼。避免使用會增加運算負荷和複雜度,但無法為使用者提供可衡量的價值的功能。
- 重構:為長期提升能源效率,請定期稽核應用程式,找出未使用的功能。請視情況採取行動,移除或重構這類功能。
- 避免不必要的作業:在需要結果之前,請勿計算值或執行動作。使用延遲評估等技術,延遲運算,直到應用程式中的相依元件需要輸出內容為止。
- 優先考量程式碼的可讀性和可重複使用性:撰寫可讀性高且可重複使用的程式碼。這個方法可減少重複作業,並遵循不要重複 (DRY) 原則,有助於減少軟體開發和維護作業的碳排放量。
使用後端快取
後端快取可確保應用程式不會重複執行相同工作。高快取命中率可讓每個請求的能源消耗量幾乎呈線性減少。如要實作後端快取,請使用下列技術:
- 快取常用資料:將常用資料儲存在臨時的高效能儲存位置。舉例來說,使用 Memorystore 等記憶體快取服務。 應用程式從快取擷取資料時,資料庫查詢和磁碟 I/O 作業的數量會減少。因此,後端資料庫和伺服器的負載會減少。
- 快取 API 回應:為避免多餘且耗費資源的網路呼叫,請快取頻繁 API 要求的結果。
- 優先使用記憶體內快取:為避免磁碟 I/O 作業緩慢和複雜的資料庫查詢,請將資料儲存在高速記憶體 (RAM) 中。
- 選取適當的快取寫入策略:
- 直寫策略可確保資料同步寫入快取和永久儲存空間。這項策略可提高快取命中率,因此持續性儲存空間收到的耗電讀取要求較少。
- 回寫 (延後寫入) 策略可提升寫入量大的應用程式效能。系統會先將資料寫入快取,稍後再以非同步方式更新資料庫。這項策略可減少較慢資料庫的即時寫入負載。
- 使用智慧型逐出政策:維持快取精簡且有效率。如要移除過時或低實用性的資料,並盡量提供空間給經常要求的資料,請使用存留時間 (TTL)、最近最少使用 (LRU) 和最少使用 (LFU) 等政策。
使用高效率的演算法和資料結構
您選擇的演算法和資料結構會決定軟體的原始運算複雜度。選取適當的演算法和資料結構,即可盡量減少完成工作所需的 CPU 週期和記憶體作業。減少 CPU 週期和記憶體作業可降低耗電量。
選擇演算法,達到最佳時間複雜度
優先使用能在最短時間內達到所需結果的演算法。這個方法有助於縮短資源使用時間。如要選取可充分運用資源的演算法,請使用下列方法:
- 著重於降低複雜度:如要評估複雜度,請考量演算法的理論複雜度,而非僅著重於執行階段指標。舉例來說,相較於泡排序,合併排序可大幅減少大型資料集的運算負載和能源消耗。
- 避免重複作業:使用所選程式設計語言或架構中內建的已最佳化函式。這些函式通常是以 C 或 C++ 等低階且更節省能源的語言實作,因此與自訂程式碼函式相比,更適合用於基礎硬體。
選取有效率的資料結構
您選擇的資料結構會決定資料的擷取、插入或處理速度。這項速度會影響 CPU 和記憶體用量。如要選取有效率的資料結構,請使用下列方法:
- 最佳化搜尋和擷取作業:對於常見作業 (例如檢查項目是否存在或擷取特定值),請優先使用經過最佳化調整的資料結構,以提高速度。舉例來說,雜湊對應或雜湊集可實現近乎恆定的時間查閱,相較於線性搜尋陣列,這種做法更節能。
- 盡量減少記憶體用量:有效率的資料結構有助於減少應用程式的整體記憶體用量。減少記憶體存取和管理作業,進而降低耗電量。此外,記憶體用量較低可讓程序更有效率地執行,因此您可延後升級資源。
- 使用專用結構:使用專為特定問題建構的資料結構。舉例來說,使用 Trie 資料結構可快速搜尋字串前置字元,而需要有效存取最高或最低值時,則可使用優先佇列。
最佳化運算和資料作業
開發軟體時,請著重於在整個技術堆疊中,有效率地使用適當比例的資源。將 CPU、記憶體、磁碟和網路視為有限的共用資源。瞭解有效運用資源可大幅降低成本和能源消耗。
最佳化 CPU 使用率和閒置時間
如要盡量減少 CPU 處於耗電的活動狀態,但未執行有意義工作的情況,請採取下列方法:
- 優先採用事件導向邏輯,而非輪詢:以事件導向邏輯取代耗用大量資源的忙碌迴圈或持續檢查 (輪詢)。事件導向架構可確保應用程式元件只會在相關事件觸發時運作。這種方法可啟用隨選處理功能,因此不需要耗用大量資源的輪詢作業。
- 避免頻率持續過高:編寫程式碼時,請勿強制 CPU 持續以最高頻率運作。為盡量減少能源消耗,閒置系統應能進入低耗電狀態或睡眠模式。
- 使用非同步處理:如要避免執行緒在閒置等待期間遭到鎖定,請使用非同步處理。這種做法可釋放資源,進而提高整體資源利用率。
有效管理記憶體和磁碟 I/O
記憶體和磁碟使用效率不彰會導致不必要的處理作業,並增加耗電量。如要有效管理記憶體和 I/O,請使用下列技巧:
- 嚴格的記憶體管理:主動釋出未使用的記憶體資源。避免在記憶體中保留大型物件的時間過長。這種做法可避免效能瓶頸,並減少記憶體存取所消耗的電力。
- 最佳化磁碟 I/O:減少應用程式與永久儲存空間資源的讀寫互動頻率。舉例來說,您可以使用中介記憶體緩衝區儲存資料。以固定間隔或緩衝區達到特定大小時,將資料寫入永久儲存空間。
- 批次作業:將頻繁的小型磁碟作業整合成較少的大型批次作業。相較於許多個別的小型交易,批次作業消耗的能源較少。
- 使用壓縮功能:套用適當的資料壓縮技術,減少寫入或讀取磁碟的資料量。舉例來說,如要壓縮儲存在 Cloud Storage 中的資料,可以使用解壓縮轉碼。
盡量減少網路流量
資料傳輸作業會消耗大量網路資源。 如要最佳化網路通訊,請使用下列技巧:
- 盡量縮小酬載大小:設計 API 和應用程式時,請確保只傳輸要求所需的資料。如果只需要幾個欄位,請避免擷取或傳回大型 JSON 或 XML 結構。確保傳回的資料結構簡潔明瞭。
- 減少往返次數:使用更智慧的通訊協定,減少完成使用者動作所需的網路往返次數。舉例來說,請優先使用 HTTP/3 而非 HTTP/1.1、選擇 GraphQL 而非 REST、使用二進位通訊協定,以及合併 API 呼叫。減少網路呼叫量可降低伺服器和使用者裝置的能源消耗。
實作前端最佳化
前端最佳化可將使用者必須下載及處理的資料量降至最低,有助於減輕使用者裝置資源的負擔。
盡量減少程式碼和資產
當使用者需要下載及處理較小且更有效率的結構化資源時,裝置耗用的電量就會減少。如要盡量減少下載量和使用者裝置的處理負載,請使用下列技巧:
- 縮減和壓縮:針對 JavaScript、CSS 和 HTML 檔案,請使用適當的縮減工具移除空白和註解等不必要的字元。請確保圖片等檔案經過壓縮及最佳化。您可以使用 CI/CD 管道,自動縮減及壓縮網頁資產。
- 延遲載入:只在實際需要時載入圖片、影片和非重要素材資源,例如這些元素捲動到網頁的可視區域時。這個方法可減少初始資料傳輸量,並降低使用者裝置的處理負載。
- 縮小 JavaScript 套件:使用新式模組套件工具和樹狀結構修剪等技術,從 JavaScript 套件中移除未使用的程式碼。這種做法可縮小檔案,加快載入速度,並減少伺服器資源用量。
- 瀏覽器快取:使用 HTTP 快取標頭,指示使用者的瀏覽器在本地儲存靜態資產。瀏覽器快取可避免重複下載,並減少後續造訪時不必要的網路流量。
優先考量輕量級使用者體驗 (UX)
使用者介面設計可能會對前端內容的算繪運算複雜度造成重大影響。如要建構提供輕量型使用者體驗的前端介面,請使用下列技術:
- 有效率的算繪:避免耗用大量資源,頻繁操控文件物件模型 (DOM)。編寫程式碼,盡量減少轉譯複雜度,並避免不必要的重新轉譯。
- 輕量設計模式:盡可能使用靜態網站或漸進式網頁應用程式 (PWA)。這類網站和應用程式載入速度較快,需要的伺服器資源也較少。
- 無障礙和效能:回應式網站載入速度快,通常也更具永續性,且更易於存取。最佳化且簡潔的設計可減少內容顯示時消耗的資源。如果網站效能和速度都經過最佳化,有助於提高收益。根據 Deloitte 和 Google 合作進行的「毫秒之差,百萬之別」研究,網站速度加快 0.1 秒 (100 毫秒),零售業網站的轉換率可提高 8.4%,平均訂單價值則可提高 9.2%。