共用方式為


最佳化程式碼成本的架構策略

適用於此 Azure Well-Architected Framework 成本優化檢查清單建議:

一氧化碳:11 將程式代碼成本優化。 評估和修改程式碼,以使用更少或更便宜的資源來滿足功能和非功能性需求。

本指南說明最佳化程式碼成本的建議。 程式碼最佳化是提高應用程式程式碼的效率、效能和成本效益的過程。 有效的程式碼最佳化涉及對程式碼進行更改,以減少資源消耗、最大限度地減少執行時間並提高整體效能。

透過最佳化程式碼,您可以識別並消除可能導致資源消耗增加和成本增加的低效率。 您可以減少處理時間、記憶體使用量和網路開銷,從而使應用程式更快、反應更快。 改進的效能增強了使用者體驗,並使您的系統能夠有效地處理更大的工作負載。

定義

術語 Definition
程式碼檢測 將程式碼片段或程式庫新增至程式碼,以在執行階段收集資料並監控程式碼效能的做法。
Concurrency 同時執行多個進程。
資料序列化 將資料物件轉換為可以儲存或傳輸的格式,然後在需要時將其重建回原始形式的過程。
熱路徑 程式中需要高效能和低延遲的重要或經常執行的區段。

成本最佳化程式碼意味著改進程式碼,以更少的每個執行個體資源(例如 CPU 週期、記憶體和儲存體)實現相同的功能。 透過減少資源消耗,您可以在應用程式處理大量資料或遇到高流量負載時節省資金。

當您遵循有關擴展、適當調整大小、冗餘和節流的其他成本最佳化工作時,程式碼改進最有效。 處理完這些基本元素後,您可以考慮程式碼最佳化。

您可能不知道您的程式碼是否效率低下。 無伺服器、自動調整和可靠性功能可以掩蓋程式碼效率低下。 下列策略可協助您識別並修正成本高於應有成本的應用程式程式碼。

檢測您的程式碼

檢測程式碼是新增程式碼片段或程式庫的做法,用於在運行時間收集資料並監控程式碼效能。 它允許開發人員收集有關關鍵指標的信息,例如資源消耗(CPU 或記憶體使用情況)和執行時間。 透過檢測程式碼,開發人員可以深入了解程式碼熱路徑、識別效能瓶頸並優化程式碼以提高效率和成本效益。

在理想的環境中,您應該在軟體開發生命週期的早期進行程式碼分析。 越早發現程式碼問題,修復成本就越低。

盡可能自動化此程式碼分析。 使用動態和靜態工具進行程式碼分析,以減少手動工作。 但是,請記住,此測試仍然是對生產的模擬。 生產提供了對程式碼最佳化最清晰的理解。

衡:程式碼監控工具可能會增加成本。

最佳化熱路徑

透過檢測程式碼,您可以測量程式碼路徑的資源耗用量。 這些測量可協助您識別熱路徑。 經常性路徑對效能和資源使用量有重大影響。 它們是需要高效能和低延遲的程式中關鍵或經常執行的部分。

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

  • 分析運行時數據: 收集和分析運行時數據,以識別消耗大量資源的代碼區域,例如 CPU、內存或 I/O 操作。 尋找經常執行或需要很長時間才能完成的程式碼模式或區段。

  • 測量效能:使用分析工具或效能測試框架來衡量程式碼路徑的執行時間和資源消耗。 此測量有助於識別瓶頸和需要改進的領域。

  • 考慮業務邏輯和使用者影響:根據程式碼路徑與應用程式功能或關鍵業務營運的相關性來評估程式碼路徑的重要性。 確定哪些程式碼路徑對於向使用者提供價值或滿足效能要求至關重要。

    檢閱您正在使用的程式設計語言特有的效能建議。 根據這些建議評估您的程式碼,以確定需要改進的領域。 移除程式碼路徑中可能影響效能的任何不必要作業。

  • 刪除不必要的函數調用: 審查您的代碼。 識別對所需功能不重要且可能對效能產生負面影響的任何功能。 例如,如果函式呼叫執行程式碼中稍早發生的驗證,您可以移除不必要的函式呼叫。

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

  • 優化循環和條件: 分析代碼中的循環和條件。 識別您可以消除的任何不必要的迭代或條件。 簡化和優化這些結構可以提高程式碼的效能。

  • 減少不必要的數據處理: 檢查您的代碼是否有任何不必要的數據處理操作,例如冗餘計算或轉換。 消除這些不必要的操作,提高程式碼的效率。

  • 最小化網路請求:如果您的程式碼發出網路請求,請最小化請求數量並優化其使用。 盡可能批次請求,避免不必要的往返,以提高效能。

  • 最小化分配:識別發生過多記憶體分配的區域。 透過減少不必要的分配並在可能的情況下重複使用現有資源來優化程式碼。

    透過最小化分配,您可以提高記憶體效率和整體效能。 為您的程式語言使用適當的記憶體管理和垃圾收集策略。

  • 減少資料結構大小:評估資料結構(例如類別)的大小,並確定可以減少的領域。 檢閱資料需求並消除任何不必要的欄位或屬性。 透過選擇合適的資料類型和有效打包資料來優化記憶體使用。

  • 評估跨領域實作:考慮跨領域實作的效果,例如中介件或權杖檢查。 評估它們是否對績效產生負面影響。

:優化程式碼和熱路徑需要開發人員在識別程式碼效率低下方面的專業知識。 這些高技能的人可能需要花時間在其他任務上。

評估並行的使用情況

評估並發的使用涉及評估非同步處理、多執行緒或多處理是否可以最大限度地提高資源利用率並降低費用。 透過使用非同步處理、多執行緒或多重處理,您可以使用相同的資源處理更多工作。 然而,確保正確實施以避免更多開銷並保持成本效益至關重要。

若要評估使用並行是否適合,您可以遵循下列準則:

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

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

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

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

    識別您可以同時獨立執行的程式碼區段。 閱讀特定於您用於多執行緒最佳實踐的程式設計語言或架構的文件或指南。 建立多個執行緒或執行緒池來處理任務的平行執行。

    實作同步機制,例如鎖、互斥鎖或信號量,以確保執行緒安全並防止程式碼存取共享資源時出現競爭條件。 考慮使用更高層級的抽象,例如執行緒池或基於任務的並行程式庫,以簡化多個執行緒的管理並簡化並發控制。

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

    判斷程式碼中的工作負載或作業是否適合平行處理。 確定您正在使用的程式語言或框架並探索其多處理功能。 例如,考慮 Python 中的多處理模組或 Java 中的平行串流。 設計您的程式碼,將工作負載分割成多個可同時處理的獨立任務。

    使用多處理 API 或程式庫來建立和管理平行進程。 在這些 API 或程式庫之間分配工作負載。 若要在多個進程之間實現協調和資料共享,請根據您的程式語言或框架實作進程間通訊 (IPC)、共用記憶體或訊息傳遞等通訊機制。

使用正確的 SDK

若要進行成本最佳化,請選取旨在最佳化資源使用量和改善效能的 SDK。 評估每個 SDK 的特性和功能非常重要。 考慮它與您的程式語言和開發環境的兼容性。

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

  • 進行效能測試:透過效能測試來比較SDK的資源使用情況和效能。 選擇最能滿足您在資源優化和效能提升方面需求的SDK。 按照提供的文檔和指南將所選 SDK 集成到您的代碼庫中。

  • 監控資源使用情況並優化程式碼:使用已實施的 SDK 監控資源使用情況。 從監控和分析中收集見解以優化您的程式碼。

選擇合適的作業系統

大多數編碼語言都可以在各種作業系統上運行,因此根據您的更便宜的替代方案評估您的作業系統非常重要。 如果替代作業系統以更低的成本支援相同或類似的功能,則值得考慮。 透過選擇更便宜的作業系統,您可以降低許可費和基礎設施成本。

正確的作業系統有助於優化工作負載的整體成本。 若要為您的工作負載選擇正確的作業系統,請嘗試下列活動:

  • 評估您的需求: 了解工作負載的特定需求,包括您使用的編碼語言和框架。 考慮與其他系統的任何依賴關係或整合。

  • 考慮相容性:確保您選擇的作業系統與您的編碼語言、框架以及您使用的任何第三方函式庫或工具相容。 檢查作業系統的文件和社群支持,以確保它與您的技術堆疊具有良好的相容性。

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

  • 比較成本:比較與作業系統相關的成本。 考慮許可費用、支援成本和基礎設施要求等因素。 尋找更便宜的替代方案,既能滿足工作負載的需求,又不影響功能。

  • 考慮效能和最佳化:評估替代作業系統的效能和最佳化能力。 尋找基準測試、案例研究或效能比較,以了解其在現實場景中的表現。

  • 審查安全性和穩定性:評估替代作業系統的安全性和穩定性。 尋找安全性更新、修補程式和社群支持,以確保作業系統得到積極維護並且整體安全穩定。

  • 考慮廠商支援:評估替代作業系統可用的廠商支援層級。 檢查是否有官方支援管道、文件和可以在您需要時提供協助的使用者社群。

最佳化網路流量

最佳化網路周遊是關於將工作負載元件之間的網路流量降到最低。 資料傳輸通常會產生相關成本。 透過最大限度地減少網路流量,您可以減少需要傳輸的資料量,同時降低成本。

分析您的工作負載並識別元件之間任何不必要的資料傳輸。 避免傳輸冗餘或重複數據,僅傳輸重要資訊。 例如,如果一個元件重複向另一個元件請求相同的資料,則它是最佳化的候選者。 您可以重構程式碼以減少不必要的呼叫或批次請求,從而最大限度地減少傳輸的資料。 當只需要幾個欄位時,應用程式可能會傳送整個物件或資料結構。 透過優化程式碼以僅發送所需的數據,您可以最大限度地減少每次資料傳輸的大小。

最佳化網路通訊協定

網路協定在網路通訊的效率中發揮著至關重要的作用。 透過優化網路協議,可以提高資料傳輸的整體效率,減少資源消耗。

考慮以下建議:

  • 選擇高效的協議:選擇在數據傳輸速度和最小化開銷方面以效率著稱的協議。 例如,考慮使用 HTTP/2 over HTTP/1.1 等協定。 這些協定旨在透過減少延遲和優化資料傳輸來提高效能。 在應用程式中使用程式庫和架構來使用這些通訊協定。

  • 支援壓縮:在網路協定中實施壓縮機制,以減少傳輸的資料大小。 壓縮可以顯著減少透過網路傳輸的資料量,從而提高效能並減少頻寬使用。 伺服器端壓縮通常會在應用程式程式碼或伺服器配置中啟用。

  • 利用連線池:連線池允許重複使用已建立的網路連接,以減少為每個請求建立新連接的開銷。 連線池可以透過避免連線設定和拆除的開銷來提高網路通訊的效率。 選擇連線集區程式庫或架構,並設定以符合工作負載需求。

  • 實施其他優化: 探索特定於您的工作負載和網絡環境的其他優化。 例如,您可以使用內容快取、負載平衡和流量整形來進一步優化網路遍歷。

將網路開銷降到最低

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

考慮以下技術:

  • 減少冗餘請求: 分析代碼以識別任何重複或不必要的請求。 您可以修改程式碼以檢索一次資料並根據需要重複使用,而不是對同一資料提出多次請求。

  • 優化資料大小:檢查元件或系統之間傳輸的數據,並尋找最小化其大小的機會。 考慮在傳輸前壓縮資料或使用更有效的資料格式等技術。 透過減小資料大小,您可以減少網路頻寬使用並提高整體效率。

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

  • 使用資料序列化:資料序列化是將複雜的資料結構或物件轉換為一種可以輕鬆透過網路傳輸或儲存在持久儲存系統中的格式的過程。 該策略涉及以標準化格式表示數據,以便數據可以在接收端有效地傳輸、處理和重建。

    選擇緊湊、快速且適合您工作負載需求的序列化格式。

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

    根據序列化格式,您需要實作邏輯,將物件或資料結構序列化為所選格式,並將它們還原序列化回原始形式。 您可以使用為格式提供序列化功能的程式庫或架構來實作此邏輯。

最佳化資料存取

優化資料存取是指簡化檢索和儲存資料的模式和技術,以最大限度地減少不必要的操作。 當您優化資料存取時,可以透過減少資源使用、減少資料檢索和提高資料處理效率來節省成本。 考慮資料快取、高效資料查詢和資料壓縮等技術。

使用快取機制

快取涉及將經常存取的資料儲存在更靠近需要它的元件的位置。 此技術透過從快取提供資料而不是透過網路獲取資料來減少網路周遊的需求。

請考慮以下快取機制:

  • 使用外部快取:一種流行的快取解決方案是內容傳遞網路。 它透過快取更靠近消費者的靜態內容來幫助最大限度地減少延遲並減少網路遍歷。

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

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

最佳化資料庫流量

您可以增強應用程式與資料庫通訊的效率。 以下是優化資料庫流量的一些關鍵注意事項和技術:

  • 建立索引:索引是建立資料結構的過程,可提高資料檢索的速度。 透過在經常查詢的資料行上建立索引,您可以大幅減少執行查詢所需的時間。 例如,如果您有一個使用者表格,其中包含使用者名稱欄,則可以在使用者名稱欄上建立索引,以加快搜尋特定使用者名稱的查詢。

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

  • 優化查詢: 通過考慮特定數據需求並最大限度地減少不必要的數據檢索來設計高效的查詢。 首先,根據資料表之間的關聯性,使用適當的聯結類型 (例如,內部聯結和左聯結)。 使用查詢最佳化技術,例如查詢提示、查詢計劃分析和查詢重寫,以提高效能。

  • 快取查詢結果:您可以將經常執行的查詢結果儲存在記憶體或快取中。 然後可以從快取提供相同查詢的後續執行,這消除了昂貴的資料庫操作的需求。

  • 使用物件關聯式對應 (ORM) 架構: 使用延遲載入、快取和批次處理等 ORM 功能來優化資料檢索並最大限度地減少資料庫往返。 使用 ORM 框架,例如 Entity Framework for C# 或 Hibernate for 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 Managed Redis。 您可以使用快取將經常存取的資料儲存在更靠近應用程式的位置,從而加快擷取速度並減少後端負載。

  • 索引和查詢最佳化:Azure SQL 資料庫Azure Cosmos DB 等 Azure 服務提供索引功能,以優化查詢效能。 透過選擇正確的索引策略和最佳化查詢,您可以提高資料檢索的整體效率。

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

  • 優化預存程序: 您可以使用 Azure SQL 資料庫 等 Azure 服務來建立和優化預存程序。 預存程序可以透過減少網路往返和預先編譯 SQL 語句來增強效能。

  • 分割與分片: Azure 在 Azure Cosmos DBAzure SQL Database 等服務中提供資料分割和分區化功能。 您可以使用分割區將資料分散到多個節點,以實現可擴展性和效能最佳化。

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

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

成本優化檢查清單

請參閱一組完整的建議。