Share via


優化程式碼成本的建議

適用于此 Azure Well-Architected 架構成本優化檢查清單建議:

CO:11 將程式碼成本優化。 評估及修改程式碼,以符合功能和非功能需求,且資源較少或較便宜。

本指南說明優化程式碼成本的建議。 程式碼優化是改善應用程式程式碼的效率、效能和成本效益的程式。 有效的程式碼優化牽涉到變更程式碼,以減少資源耗用量、最小化執行時間,以及改善整體效能。

藉由優化程式碼,您可以識別並消除效率不佳,這可能會導致資源耗用量增加和成本較高。 您可以減少處理時間、記憶體使用量和網路額外負荷,這可能會導致更快速且更回應的應用程式。 改善的效能可增強使用者體驗,並讓您的系統有效率地處理較大的工作負載。

定義

詞彙 定義
程式碼檢測 將程式碼片段或程式庫新增至在執行時間收集資料和監視程式碼效能的程式碼的做法。
並行 同時執行多個進程。
資料序列化 將資料物件轉換成可儲存或傳輸的格式,然後視需要重新建構成原始格式的程式。
熱路徑 需要高效能和低延遲之程式的重要或經常執行區段。

主要設計策略

成本優化程式碼表示改善程式碼,以使用較少的每個實例資源來達到相同的功能,例如 CPU 週期、記憶體和儲存體。 藉由減少資源耗用量,您可以在應用程式處理大量資料或體驗高流量負載時節省成本。

當您遵循調整、許可權調整、備援和節流的其他成本優化工作時,程式碼改善最有效。 在處理這些基礎元素之後,您可以考慮程式碼優化。

您可能不知道您是否沒有效率的程式碼。 無伺服器、自動調整和可靠性功能可以遮罩程式碼效率不佳。 下列策略可協助您找出並修正其成本高於其成本的應用程式程式碼。

實作您的程式碼

檢測程式碼是新增程式碼片段或程式庫,以在執行時間收集資料和監視程式碼效能的做法。 它可讓開發人員收集重要計量的相關資訊,例如資源耗用量 (CPU 或記憶體使用量) 和執行時間。 藉由檢測程式碼,開發人員可以深入瞭解程式碼熱路徑、找出效能瓶頸,並將程式碼優化,以提升效率與成本效益。

在理想的環境中,您應該在軟體發展生命週期中提早執行程式碼分析。 您稍早攔截到程式碼問題,要修正的程式碼比較便宜。

盡可能自動化此程式碼分析。 使用動態和靜態工具進行程式碼分析,以減少手動工作。 不過,請記住,此測試仍是生產環境的模擬。 生產環境可清楚瞭解程式碼優化。

取捨:程式碼監視工具可能會增加成本。

識別和優化熱路徑

藉由檢測程式碼,您可以測量程式碼路徑的資源耗用量。 這些度量可協助您識別熱路徑。 經常性路徑對效能和資源使用量有顯著的影響。 它們是需要高效能和低延遲之程式的重要或經常執行區段。

若要識別經常性路徑,請考慮下列工作:

  • 分析執行時間資料:收集和分析執行時間資料,以識別耗用大量資源的程式碼區域,例如 CPU、記憶體或 I/O 作業。 尋找經常執行的程式碼模式或區段,或需要很長的時間才能完成。

  • 測量效能:流量分析工具或效能測試架構來測量程式碼路徑的執行時間和資源耗用量。 此度量有助於識別瓶頸和改善的區域。

  • 考慮商務邏輯和使用者效果:根據程式碼路徑對應用程式功能或重要商務作業的相關性,評估程式碼路徑的重要性。 判斷哪些程式碼路徑對使用者傳遞價值或符合效能需求至關重要。

    檢閱您正在使用之程式設計語言專屬的效能建議。 根據這些建議評估您的程式碼,以找出改善的區域。 移除程式碼路徑中可能會影響效能的任何不必要的作業。

  • 移除不必要的函式呼叫:檢閱您的程式碼。 識別對所需功能而言並非必要的任何函式,而且可能會對效能造成負面影響。 例如,如果函式呼叫執行稍早在程式碼中發生的驗證,您可以移除該不必要的函式呼叫。

  • 將記錄作業降到最低:記錄有助於偵錯和分析,但過多的記錄可能會影響效能。 評估每個記錄作業的需求,並移除對效能分析而言不重要的任何不必要的記錄呼叫。

  • 優化迴圈和條件:分析程式碼中的迴圈和條件。 識別您可以排除的任何不必要的反復專案或條件。 簡化和優化這些結構可以改善程式碼的效能。

  • 減少不必要的資料處理:檢閱您的程式碼是否有任何不必要的資料處理作業,例如備援計算或轉換。 消除這些不必要的作業,以改善程式碼的效率。

  • 最小化網路要求:如果您的程式碼提出網路要求,請將要求數目降到最低,並將其使用量優化。 盡可能批次要求,並避免不必要的來回行程來改善效能。

  • 最小化配置:識別發生過多記憶體配置的區域。 盡可能減少不必要的配置並重複使用現有資源,以優化程式碼。

    藉由將配置降至最低,您可以改善記憶體效率與整體效能。 針對程式設計語言使用適當的記憶體管理和垃圾收集策略。

  • 減少資料結構大小:評估資料結構的大小,例如類別,以及識別可能縮減的區域。 檢閱資料需求,並消除任何不必要的欄位或屬性。 選取適當的資料類型並有效率地封裝資料,以優化記憶體使用量。

  • 評估跨領域實作:請考慮跨領域實作的效果,例如中介軟體或權杖檢查。 評估它們是否對效能造成負面影響。

取捨:優化程式碼和熱門路徑需要開發人員在識別程式碼效率不佳方面具備專業知識。 這些高度技能的個人可能需要花費時間處理其他工作。

評估平行存取的使用方式

評估並行的使用牽涉到評估非同步處理、多執行緒或多重處理是否可以最大化資源使用率並降低費用。 藉由使用非同步處理、多執行緒或多重處理,您可以使用相同資源來處理更多工作。 不過,請務必確保適當的實作以避免更多額外負荷,並維持成本效益。

若要評估是否適合使用平行存取,您可以遵循下列指導方針:

  • 非同步處理:非同步處理允許非封鎖執行。 例如,您可以啟動進程,然後暫停它,以允許第二個進程完成。

    判斷您可以非同步執行的程式碼元件或作業。 識別您使用的程式設計語言或架構,並瞭解其支援的非同步程式設計模型,例如 async/await 在 .NET 中,或在 JavaScript 中承諾。

    藉由啟用非封鎖執行工作,重新建構程式碼以使用非同步程式設計建構。 使用非同步方法或回呼,將長時間執行或 I/O 密集作業與主要執行執行緒分離。 使用程式設計語言或架構所提供的非同步 API 或程式庫來處理非同步工作流程。

  • 多執行緒:在多執行緒中,您可以同時執行單一進程的多個執行緒。

    識別您可以並行且獨立執行的程式碼區段。 閱讀您用於多執行緒最佳做法之程式設計語言或架構專屬的檔或指導方針。 建立多個執行緒或執行緒集區來處理工作的平行執行。

    實作同步處理機制,例如鎖定、Mutex 或旗號,以確保執行緒安全,並在程式碼存取共用資源時防止競爭條件。 請考慮使用較高層級的抽象概念,例如執行緒集區或工作型平行處理原則程式庫,以簡化多個執行緒的管理,並簡化並行控制。

  • 多重處理:多重處理可以平行執行進程。 其可提供比多執行緒更好的多個 CPU 核心使用率。

    判斷程式碼中的工作負載或作業是否適合平行處理。 識別您使用的程式設計語言或架構,並探索其多重處理功能。 例如,請考慮 Python 中的多重處理模組,或 JAVA 中的平行資料流程。 設計程式碼,將工作負載分割成多個可同時處理的獨立工作。

    使用多重處理 API 或程式庫來建立和管理平行進程。 在這些 API 或程式庫之間散發工作負載。 若要啟用多個進程之間的協調和資料共用,請根據程式設計語言或架構實作通訊機制,例如處理序間通訊 (IPC) 、共用記憶體或訊息傳遞。

使用正確的 SDK

針對成本優化,請選取設計來優化資源使用量並改善效能的 SDK。 請務必評估每個 SDK 的功能。 請考慮其與程式設計語言和開發環境的相容性。

以下是協助您為工作負載選擇最佳 SDK 的指引:

  • 進行效能測試:透過效能測試來比較 SDK 的資源使用量和效能。 根據資源優化和效能改善,選擇最符合您需求的 SDK。 遵循提供的檔和指導方針,將所選的 SDK 整合到您的程式碼基底。

  • 監視資源使用量並優化程式碼:使用實作的 SDK 監視資源使用量。 從監視和分析收集深入解析,以優化您的程式碼。

選擇正確的作業系統

大部分的程式碼撰寫語言都可以在各種作業系統上執行,因此請務必針對較便宜的替代方案評估您的作業系統。 如果替代作業系統支援成本較低的相同或類似功能,值得考慮。 藉由選擇較便宜的作業系統,您可以降低授權費用和基礎結構成本的成本。

正確的作業系統可為您的工作負載提供整體成本優化。 若要為您的工作負載選擇正確的作業系統,請嘗試這些活動:

  • 評估您的需求:瞭解工作負載的特定需求,包括您所使用的編碼語言和架構。 請考慮任何相依性或與其他系統的整合。

  • 請考慮相容性:請確定您選擇的作業系統與程式碼撰寫語言、架構,以及您使用的任何協力廠商程式庫或工具相容。 請檢查作業系統的檔和社群支援,以確保其與技術堆疊有良好的相容性。

  • 評估功能:判斷替代作業系統是否支援與目前作業系統相同的或類似功能。 評估它是否提供工作負載所需的必要特性和功能。

  • 比較成本:比較與作業系統相關聯的成本。 請考慮授權費用、支援成本和基礎結構需求等因素。 尋找符合您工作負載需求的較便宜替代方案,而不會危害功能。

  • 請考慮效能和優化:評估替代作業系統的效能和優化功能。 尋找基準測試、案例研究或效能比較,以瞭解它在真實世界案例中的執行方式。

  • 檢閱安全性和穩定性:評估替代作業系統的安全性和穩定性。 尋找安全性更新、修補程式和社群支援,以確保作業系統已主動維護且整體安全且穩定。

  • 請考慮廠商支援:評估替代作業系統可用的廠商支援層級。 檢查是否有官方支援頻道、檔和一個使用者社群,可視需要提供協助。

優化網路周遊

優化網路周遊是將工作負載元件之間的網路流量降至最低。 資料傳輸通常具有相關聯的成本。 藉由將網路流量降至最低,您可以減少需要傳輸的資料量,同時降低成本。

分析您的工作負載,並識別元件之間的任何不必要的資料傳輸。 避免傳輸備援或重複的資料,並只傳輸基本資訊。 例如,如果元件重複向另一個元件要求相同的資料,則它是優化候選項目。 您可以重構程式碼,以減少不必要的呼叫或批次要求,將傳輸的資料降至最低。 當只需要幾個欄位時,應用程式可能會傳送整個物件或資料結構。 藉由優化程式碼只傳送所需的資料,您可以將每個資料傳輸的大小降到最低。

優化網路通訊協定

網路通訊協定在網路通訊效率方面扮演重要角色。 藉由優化網路通訊協定,您可以改善資料傳輸的整體效率,並減少資源耗用量。

請考慮下列建議:

  • 選擇有效率的通訊協定:選取在資料傳送速率方面已知且將額外負荷降至最低的通訊協定。 例如,請考慮使用 HTTP/2 over HTTP/1.1 等通訊協定。 這些通訊協定的設計目的是為了降低延遲並優化資料傳輸來改善效能。 在應用程式中使用程式庫和架構來使用這些通訊協定。

  • 支援壓縮:在您的網路通訊協定中實作壓縮機制,以減少傳輸的資料大小。 壓縮可大幅減少透過網路傳輸的資料量,進而改善效能並減少頻寬使用量。 伺服器端壓縮通常會在應用程式程式碼或伺服器組態中啟用。

  • 利用連線共用:連線共用允許重複使用已建立的網路連線,以減少為每個要求建立新連線的額外負荷。 連線共用可藉由避免連線設定和終止的額外負荷來提升網路通訊的效率。 選擇連線共用程式庫或架構,並設定以符合工作負載需求。

  • 實作其他優化:探索工作負載和網路環境特有的其他優化。 例如,您可以使用內容快取、負載平衡和流量成形,進一步優化網路周遊。

將網路額外負荷降到最低

將工作負載元件之間的網路流量和資料傳輸量降至最低。 藉由減少網路額外負荷,您可以降低與資料輸出和輸入相關聯的成本,並改善整體網路效能。

請考慮下列技術:

  • 減少備援要求:分析程式碼以識別任何重複或不必要的要求。 您可以修改程式碼以擷取資料一次,並視需要重複使用資料,而不是對相同資料提出多個要求。

  • 優化資料大小:檢閱元件或系統之間傳輸的資料,並尋找將大小降至最低的機會。 請考慮在傳輸之前壓縮資料或使用更有效率的資料格式等技術。 藉由減少資料大小,您可以減少網路頻寬使用量,並提升整體效率。

  • 批次要求:如果適用,請考慮將多個較小的要求批次處理成單一較大的要求。 批次處理可減少建立多個連線的額外負荷,並減少整體資料傳輸。

  • 使用資料序列化:資料序列化是將複雜資料結構或物件轉換成可透過網路輕鬆傳輸或儲存在永續性儲存系統中的格式的程式。 此策略牽涉到以標準化格式表示資料,因此資料可以在接收端有效率地傳輸、處理及重建。

    選取精簡、快速且適合您工作負載需求的序列化格式。

    序列化格式 Description
    通訊協定緩衝區 (protobuf) 二進位序列化格式,可提供有效率的結構化資料編碼和解碼。 它會使用具類型的定義檔案來定義訊息結構。
    MessagePack 透過網路壓縮傳輸的二進位序列化格式。 它支援各種資料類型,並提供快速序列化和還原序列化效能。
    JavaScript 物件標記法 (JSON) 廣泛使用的資料序列化格式,可人類閱讀且容易使用。 JSON 是以文字為基礎,且具有廣泛的跨平臺支援。
    二進位 JSON (BSON) 類似于 JSON 的二進位序列化格式,但專為有效率的序列化和還原序列化而設計。 BSON 包含 JSON 中無法使用的額外資料類型。

    視序列化格式而定,您必須實作邏輯,將物件或資料結構序列化為所選格式,並將其還原序列化回原始格式。 您可以使用提供格式序列化功能的程式庫或架構來實作此邏輯。

優化資料存取

優化資料存取是指簡化擷取和儲存資料的模式和技術,以將不必要的作業降至最低。 當您優化資料存取時,您可以藉由減少資源使用量、減少資料擷取,以及改善資料處理的效率來節省成本。 請考慮資料快取、有效率的資料查詢和資料壓縮等技術。

使用快取機制

快取牽涉到將經常存取的資料儲存到更接近需要它的元件。 這項技術可藉由從快取提供資料,而不是透過網路擷取來減少網路周遊的需求。

請考慮這些快取機制:

  • 使用外部快取:一個熱門快取解決方案是內容傳遞網路。 其可藉由快取更接近取用者的靜態內容,協助將延遲降到最低並降低網路周遊。

  • 調整快取參數:設定快取參數,例如存留時間 (TTL) ,以優化快取的優點,同時將潛在缺點降至最低。 設定適當的 TTL 可確保快取的資料保持最新且相關。

  • 使用記憶體內部快取:除了外部快取解決方案之外,請考慮在應用程式中實作記憶體內部快取。 記憶體內部快取有助於利用閒置的計算資源,並增加已配置資源的計算密度。

優化資料庫流量

您可以增強應用程式與資料庫通訊的效率。 以下是優化資料庫流量的一些重要考慮和技術:

  • 建立索引:編制索引是建立資料結構以提升資料擷取速度的程式。 藉由在經常查詢的資料行上建立索引,您可以大幅減少執行查詢所需的時間。 例如,如果您有具有使用者名稱資料行的使用者資料表,您可以在使用者名稱資料行上建立索引,以加速搜尋特定使用者名稱的查詢。

    識別最常存取的資料行,並在這些資料行上建立索引,以加速資料擷取。 定期分析並優化現有的索引,以確保它們仍然有效。 避免過度編制索引,因為它可能會對插入和更新作業造成負面影響。

  • 優化查詢:考慮特定資料需求並最小化不必要的資料擷取,以設計有效率的查詢。 首先,根據資料表之間的關聯性,使用適當的聯結類型 (例如內部聯結和左聯結) 。 使用查詢優化技術,例如查詢提示、查詢計劃分析和查詢重寫,以改善效能。

  • 快取查詢結果:您可以將經常執行查詢的結果儲存在記憶體或快取中。 接著可以從快取提供相同查詢的後續執行,這樣就不需要昂貴的資料庫作業。

  • 使用物件關聯式對應 (ORM) 架構: 使用 ORM 功能,例如延遲載入、快取和批次處理,將資料擷取優化,並將資料庫來回行程降到最低。 使用 ORM 架構,例如適用于 C# 的 Entity Framework 或適用于 JAVA 的休眠。

  • 優化預存程式:分析並優化預存程式的邏輯和效能。 目標是避免預存程式中不必要的計算或備援查詢。 將臨時表、變數和資料指標的使用優化,以將資源耗用量降到最低。

組織資料

組織資料以進行有效率的存取和擷取牽涉到建構和儲存資料,以最大化效能並將資源耗用量降到最低。 它可以改善查詢回應時間、降低資料傳輸成本,以及優化儲存體使用率。

以下是一些有效率地組織資料的技術:

  • 資料分割:資料分割牽涉到將大型資料集分割成較小的可管理子集,稱為分割區。 您可以個別儲存每個分割區,以允許平行處理和改善的查詢效能。 例如,您可以根據特定值範圍或跨伺服器散發資料來分割資料。 這項技術可以增強延展性、減少爭用,以及優化資源使用率。

  • 分區:分區化是水準分割資料跨多個資料庫實例或伺服器的技術。 每個分區都包含資料的子集,而且可以跨這些分區平行處理查詢。 分區化可藉由散發工作負載並減少每個查詢存取的資料量,來改善查詢效能。

  • 壓縮:資料壓縮牽涉到減少資料的大小,以將儲存體需求降到最低,並改善資料傳輸的效率。 由於壓縮的資料佔用較少的磁碟空間,因此可節省儲存體成本。 壓縮的資料也可以透過網路更快速地傳輸,並減少資料傳輸成本。

例如,假設您有大型客戶資訊的資料集。 藉由根據用戶端區域或人口統計來分割資料,您可以將工作負載分散到多部伺服器,並改善查詢效能。 您也可以壓縮資料以降低儲存體成本,並提升資料傳輸的效率。

優化架構

評估您的工作負載架構,以找出資源優化的機會。 目標是針對正確的作業使用正確的服務。

若要達到此目標,您可能需要重新設計架構的一部分,以使用較少的資源。 請考慮無伺服器或受控服務,並優化資源配置。 藉由優化您的架構,您可以符合功能性和非功能需求,同時耗用較少的每個實例資源。

使用設計模式

設計模式是可重複使用的解決方案,可協助開發人員解決週期性設計問題。 它們提供結構化方法來設計有效率、可維護且可調整的程式碼。

設計模式可藉由提供有效率的資源配置和管理指導方針,協助優化系統資源的使用。 例如,斷路器模式藉由提供一種機制,以控制的方式處理和復原失敗,有助於防止不必要的資源耗用量。

設計模式可透過下列方式協助成本優化程式碼:

  • 降低開發時間:設計模式可為常見的設計問題提供經過實證的解決方案,這可節省開發時間。 藉由遵循已建立的模式,開發人員可以避免重複的工作,並專注于實作其應用程式的特定需求。

  • 改善的可維護性:設計模式可提升模組化和結構化程式碼,讓您更容易瞭解、修改和維護。 其可能會導致成本節省,以降低偵錯和維護工作。

  • 延展性和效能:設計模式有助於設計可調整且高效能的系統。 例如 Cache-Aside 模式的模式可藉由快取經常存取的資料來改善效能,以減少昂貴的計算或外部呼叫需求。

若要實作設計模式,開發人員必須瞭解每個模式的原則和指導方針,並在程式碼中加以套用。 請考慮找出問題的適當模式、瞭解其結構和元件,以及將模式整合到整體設計中。

提供各種資源,例如檔、教學課程和範例程式碼。 這些資源可協助開發人員有效地學習及實作設計模式。

變更組態

定期檢閱並更新您的工作負載設定,以確保其符合您目前的需求。 請考慮根據工作負載需求調整資源大小和組態設定。 藉由優化組態,您可以有效地配置資源,並避免過度布建以節省成本。

重構架構

評估您的工作負載架構,並找出重構或重新設計元件的機會,以優化資源耗用量。 請考慮採用微服務架構、實作斷路器模式和使用無伺服器運算等技術。 藉由優化您的架構,您可以達到更好的資源使用率和成本效益。

修改資源大小

持續監視和分析工作負載的資源使用率。 根據觀察到的模式和趨勢,調整資源大小和組態設定,以優化資源耗用量。

請考慮將虛擬機器調整為許可權、調整記憶體配置,以及優化儲存體容量。 藉由將資源許可權化,您可以避免與使用量過低或過度布建相關聯的不必要的成本。

取捨:重新工時程式碼和架構可能不符合目前的專案排程,而且可能會導致排程和成本名單。

Azure 設施

檢測程式碼:Azure 提供監視和記錄工具 ,例如 Azure 監視器Application InsightsLog Analytics。 您可以使用這些工具即時追蹤和分析程式碼的效能和行為。

識別經常性存取和優化路徑:Application Insights 和 Application Insights Profiler 可藉由分析執行時間和資源使用量,協助識別並優化程式碼中的經常性路徑。 您可以使用 Profiler 將不必要的記憶體配置降至最低,並將記憶體使用量優化。

使用正確的SDK:Azure 提供多種程式設計語言 的 SDK ,專為效能和方便使用而優化。 這些 SDK 提供與 Azure 服務互動的預先建置函式和程式庫,以減少自訂實作的需求。

優化網路周遊:各種 Azure 服務支援高速網路通訊協定,例如 HTTP/2QUIC ,以在服務和應用程式之間進行有效率的通訊。

Azure 服務,例如適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器,支援連線共用

Azure 支援各種服務的批次處理,因此您可以將多個作業分組在一起,並在單一要求中執行。 批次處理可以大幅提升效率,並減少網路額外負荷。

關於資料序列化,Azure 支援各種序列化格式,包括 JSON 和 XML。 根據資料大小、效能需求和互通性需求,選擇適當的序列化格式。

優化資料存取:Azure 提供快取服務,例如Azure Cache for Redis。 您可以使用快取,將經常存取的資料儲存在靠近應用程式,這會導致更快速的擷取和減少後端負載。

  • 索引編制和查詢優化:Azure SQL DatabaseAzure Cosmos DB 等 Azure服務提供索引功能,以優化查詢效能。 藉由選擇正確的索引編制策略和優化查詢,您可以改善資料擷取的整體效率。

  • ORM (物件關聯式對應) : Azure 支援 ORM 架構,例如 Entity Framework。 這些架構可簡化物件導向程式碼與關聯式或 NoSQL 資料庫之間的資料存取和對應。

  • 優化預存程式:您可以使用Azure SQL Database之類的 Azure 服務來建立和優化預存程式。 預存程式可以藉由減少網路往返和先行編譯 SQL 語句來增強效能。

  • 資料分割和分區化:Azure 在Azure Cosmos DBAzure SQL Database等服務中提供資料分割和分區化功能。 您可以使用資料分割將資料分散到多個節點,以進行延展性和效能優化。

  • 壓縮資料: Azure 服務支援 GZIP 和 DEFLATE 等資料壓縮技術。

優化架構:Azure 提供架構指引和設計模式,以設計可調整、復原且高效能的應用程式。 如需詳細資訊,請參閱 設計模式

成本優化檢查清單

請參閱一組完整的建議。