優化程式代碼成本的建議
適用於此 Azure 架構完善的架構成本優化檢查清單建議:
CO:11 | 將程式代碼成本優化。 評估並修改程序代碼,以符合功能和非功能性需求,且資源較少或更便宜。 |
---|
本指南說明優化程序代碼成本的建議。 程式代碼優化是改善應用程式程序代碼的效率、效能和成本效益的程式。 有效的程式代碼優化牽涉到對程式代碼進行變更,以減少資源耗用量、最小化運行時間,以及改善整體效能。
藉由優化程序代碼,您可以識別並消除可能導致資源耗用量增加和成本較高的效率不足。 您可以減少處理時間、記憶體使用量和網路額外負荷,這可能會導致應用程式更快且回應更快速。 改善的效能可增強用戶體驗,並讓您的系統有效率地處理較大的工作負載。
定義
詞彙 | 定義 |
---|---|
程式代碼檢測 | 將代碼段或連結庫新增至在運行時間收集數據和監視程式代碼效能的程式碼的做法。 |
並行 | 同時執行多個進程。 |
數據串行化 | 將數據物件轉換成可儲存或傳輸的格式,然後在需要時重新建構回原始格式的程式。 |
經常性路徑 | 需要高效能和低延遲之程式的重要或經常執行區段。 |
關鍵設計策略
成本優化程式代碼表示改善程序代碼,以使用較少的每個實例資源達到相同的功能,例如 CPU 週期、記憶體和記憶體和記憶體。 藉由減少資源使用量,當應用程式處理大量資料或經歷高流量負載時,將可節省成本。
當您遵循其他成本優化工作來調整、調整許可權、備援和節流時,程式代碼改善最有效。 在處理這些基本元素之後,您可以考慮程式代碼優化。
您可能不知道是否有效率不佳的程序代碼。 無伺服器、自動調整和可靠性功能可以遮罩程式代碼效率不佳。 下列策略可協助您找出並修正成本高於其應該成本的應用程式程序代碼。
實作您的程式碼
檢測程式代碼是新增代碼段或連結庫的做法,這些代碼段會在運行時間收集數據及監視程序代碼效能。 它可讓開發人員收集重要計量的相關信息,例如資源耗用量(CPU 或記憶體使用量)和運行時間。 藉由檢測程式代碼,開發人員可以深入瞭解程式代碼熱路徑、找出效能瓶頸,以及將程式代碼優化以提升效率和成本效益。
在理想的環境中,您應該在軟體開發生命週期早期執行程式代碼分析。 您稍早就發現程式代碼問題,其修正成本越便宜。
盡可能自動化此程式代碼分析。 使用動態和靜態工具進行程序代碼分析,以減少手動工作。 不過,請記住,此測試仍然是生產環境的模擬。 生產環境可讓您最清楚瞭解程式代碼優化。
取捨:程式代碼監視工具可能會增加成本。
優化熱路徑
藉由檢測程式代碼,您可以測量程式代碼路徑的資源耗用量。 這些度量可協助您識別熱門路徑。 經常性路徑對效能和資源使用量有顯著的影響。 它們是需要高效能和低延遲之程式的重要或經常執行區段。
若要識別經常性路徑,請考慮下列工作:
分析運行時間數據:收集和分析運行時間數據,以識別耗用大量資源的程式代碼區域,例如 CPU、記憶體或 I/O 作業。 尋找經常執行的模式或程式碼區段,或需要很長的時間才能完成。
測量效能:使用分析工具或效能測試架構來測量程式代碼路徑的運行時間和資源耗用量。 此量測有助於識別瓶頸和改進區域。
考慮商業規則和使用者效果:根據程式碼路徑與應用程式功能或重要商務作業的相關性來評估程式代碼路徑的重要性。 判斷哪些程式代碼路徑對於傳遞價值給使用者或符合效能需求至關重要。
檢閱您正在使用之程式設計語言特有的效能建議。 根據這些建議評估您的程式代碼,以找出改進的區域。 拿掉程式代碼路徑中可能會影響效能的任何不必要的作業。
拿掉不必要的函數調用:檢閱您的程序代碼。 識別對於所需功能而言並非必要功能且可能對效能造成負面影響的任何函式。 例如,如果函式呼叫執行程式代碼稍早發生的驗證,您可以移除該不必要的函數調用。
將記錄作業降到最低:記錄對於偵錯和分析很有説明,但過度記錄可能會影響效能。 評估每個記錄作業的必要條件,並移除對效能分析而言不重要的任何不必要的記錄呼叫。
優化迴圈和條件:分析程序代碼中的迴圈和條件。 識別您可以排除的任何不必要的反覆項目或條件。 簡化和優化這些結構可以改善程式碼的效能。
減少不必要的數據處理:檢閱您的程式代碼是否有任何不必要的數據處理作業,例如備援計算或轉換。 消除這些不必要的作業,以改善程序代碼的效率。
最小化網路要求:如果您的程式代碼提出網路要求,請將要求數目降到最低,並將其使用量優化。 盡可能批次要求,並避免不必要的來回行程以改善效能。
最小化配置:識別發生過多記憶體配置的區域。 盡可能減少不必要的配置並重複使用現有的資源,以優化程序代碼。
藉由將配置降到最低,您可以改善記憶體效率與整體效能。 針對程式設計語言使用適當的記憶體管理和垃圾收集策略。
減少數據結構大小:評估數據結構的大小,例如類別,並找出可能縮減的區域。 檢閱數據需求,並排除任何不必要的欄位或屬性。 選取適當的數據類型並有效率地封裝數據,以優化記憶體使用量。
評估跨領域實作:請考慮跨領域實作的影響,例如中間件或令牌檢查。 評估它們是否對效能造成負面影響。
取捨:優化程式代碼和熱門路徑需要開發人員專業知識來識別程序代碼效率不佳。 這些高技能的個人可能需要花時間處理其他工作。
評估並行存取的使用方式
評估並行存取的使用牽涉到評估異步處理、多線程或多重處理是否可將資源使用率最大化,並減少費用。 藉由使用非同步處理、多執行緒或多處理,相同的資源將可用來處理更多工作。 不過,請務必確保適當的實作,以避免更多額外負荷並維護成本效益。
若要評估是否適合使用並行存取,您可以遵循下列指導方針:
異步處理:異步處理允許非封鎖執行。 例如,您可以啟動進程,然後暫停它,以允許第二個進程完成。
判斷您可以異步執行的程式代碼元件或作業。 識別您使用的程式設計語言或架構,並瞭解其支援的異步程序設計模型,例如
async
/await
在 .NET 中,或在 JavaScript 中承諾。藉由啟用非封鎖執行工作,重新建構程式代碼以使用異步程式設計建構。 使用異步方法或回呼,將長時間執行的或 I/O 密集作業與主要執行線程分離。 使用程式設計語言或架構所提供的異步 API 或連結庫來處理異步工作流程。
多線程:在多線程中,您可以同時執行單一進程的多個線程。
識別您可以同時獨立執行的程式代碼區段。 閱讀您用於多線程最佳做法之程式設計語言或架構特有的文件或指導方針。 建立多個線程或線程集區來處理工作的平行執行。
實作同步處理機制,例如鎖定、Mutex 或號誌,以確保線程安全,並在程式代碼存取共用資源時防止競爭狀況。 請考慮使用較高層級的抽象概念,例如線程集區或工作型平行處理原則連結庫,以簡化多個線程的管理,並簡化並行控制。
Multiprocessing:Multiprocessing 可以平行執行進程。 其可提供比多線程更好的多個CPU核心使用率。
判斷程式代碼中的工作負載或作業是否適合平行處理。 識別您使用的程式設計語言或架構,並探索其多重處理功能。 例如,請考慮 Python 中的多重處理模組或 Java 中的平行串流。 設計程式代碼,將工作負載分割成多個可同時處理的獨立工作。
使用多重處理 API 或連結庫來建立和管理平行進程。 將這些 API 或連結庫分散工作負載。 若要在多個進程之間啟用協調和數據共用,請根據您的程式設計語言或架構,實作通訊機制,例如進程間通訊(IPC)、共用記憶體或訊息傳遞。
使用正確的 SDK
針對成本優化,請選取專為優化資源使用量和改善效能而設計的SDK。 請務必評估每個 SDK 的特性和功能。 請考慮其與程式設計語言和開發環境的相容性。
以下是協助您為工作負載選擇最佳 SDK 的指引:
進行效能測試:透過效能測試來比較 SDK 的資源使用量和效能。 在資源優化和效能改善方面,選擇最符合需求的 SDK。 遵循所提供的文件和指導方針,將所選的 SDK 整合到您的程式代碼基底。
監視資源使用量並優化程序代碼:使用實作的SDK監視資源使用量。 從監視和分析收集深入解析,以優化您的程序代碼。
選擇正確的操作系統
大部分的程式代碼撰寫語言都可以在各種操作系統上執行,因此請務必根據更便宜的替代方案來評估您的操作系統。 如果替代操作系統以較低的成本支援相同或類似的功能,值得考慮。 藉由選擇更便宜的操作系統,您可以降低授權費用和基礎結構成本的成本。
正確的操作系統可為您的工作負載提供整體成本優化。 若要為您的工作負載選擇正確的操作系統,請嘗試這些活動:
評估您的需求:瞭解工作負載的特定需求,包括您使用的程式代碼語言和架構。 請考慮與其他系統的任何相依性或整合。
請考慮相容性:請確定您選擇的操作系統與程式代碼撰寫語言、架構,以及您使用的任何第三方連結庫或工具相容。 請檢查操作系統的檔與社群支援,以確保它與您的技術堆疊有良好的相容性。
評估功能:判斷替代作業系統是否支援與您目前操作系統相同的或類似功能。 評估它是否提供工作負載所需的必要特性和功能。
比較成本:比較與操作系統相關聯的成本。 請考慮授權費用、支援成本和基礎結構需求等因素。 尋找符合您工作負載需求的更便宜替代方案,而不會影響功能。
請考慮效能和優化:評估替代操作系統的效能和優化功能。 尋找基準檢驗、案例研究或效能比較,以瞭解它在真實世界中的表現。
檢閱安全性和穩定性:評估替代操作系統的安全性與穩定性。 尋找安全性更新、修補程式和社群支援,以確保操作系統會主動維護且整體安全且穩定。
請考慮廠商支援:評估替代操作系統可用的廠商支援層級。 檢查是否有官方支援管道、文件和使用者社群,如有需要,可以提供協助。
優化網路流量
優化網路周遊是將工作負載元件之間的網路流量降到最低。 數據傳輸通常具有相關聯的成本。 藉由將網路流量降到最低,您可以減少需要傳輸的數據量,同時降低成本。
分析您的工作負載,並識別元件之間任何不必要的數據傳輸。 避免傳輸備援或重複的數據,並只傳輸基本資訊。 例如,如果元件重複向另一個元件要求相同的數據,則它是優化候選專案。 您可以重構程序代碼,以減少不必要的呼叫或批次要求,將傳輸的數據降至最低。 當只需要幾個欄位時,應用程式可能會傳送整個物件或數據結構。 藉由將程式代碼優化,只傳送必要的數據,您可以將每個數據傳輸的大小降到最低。
優化網路協定
網路協議在網路通訊效率方面發揮著重要作用。 藉由優化網路協定,您可以改善數據傳輸的整體效率,並減少資源耗用量。
請考慮下列建議:
選擇有效率的通訊協議:選取在數據傳送速率方面以效率著稱的通訊協定,並將額外負荷降至最低。 例如,請考慮使用 HTTP/2 over HTTP/1.1 等通訊協定。 這些通訊協定旨在藉由減少延遲並優化數據傳輸來改善效能。 在應用程式中使用連結庫和架構來使用這些通訊協定。
支援壓縮:在您的網路通訊協定中實作壓縮機制,以減少傳輸的數據大小。 壓縮可大幅減少透過網路傳輸的數據量,進而改善效能並降低頻寬使用量。 伺服器端壓縮通常會在應用程式程式碼或伺服器組態中啟用。
利用連線共享:連線共用允許重複使用已建立的網路連線,以減少為每個要求建立新聯機的額外負荷。 線上共用可以藉由避免連線設定和卸除的額外負荷來提升網路通訊的效率。 選擇連線共用連結庫或架構,並設定以符合工作負載需求。
實作其他優化:探索工作負載和網路環境特有的其他優化。 例如,您可以使用內容快取、負載平衡和流量成形,進一步優化網路周遊。
將網路負荷降至最低
將工作負載元件之間的網路流量和數據傳輸量降至最低。 藉由減少網路負荷,您可以降低與數據輸出和輸入相關聯的成本,並改善整體網路效能。
請考慮下列技術:
減少備援要求:分析程式碼以識別任何重複或不必要的要求。 您可以修改程式代碼以擷取數據一次,並視需要重複使用數據,而不是對相同數據提出多個要求。
優化數據大小:檢閱在元件或系統之間傳輸的數據,並尋找將大小降到最低的機會。 請考慮在傳輸之前壓縮數據,或使用更有效率的數據格式等技術。 藉由減少數據大小,您可以減少網路頻寬使用量,並提升整體效率。
批次要求:如果適用,請考慮將多個較小的要求批處理成單一較大的要求。 批處理可減少建立多個連線的額外負荷,並減少整體數據傳輸。
使用資料串行化:數據串行化是將複雜數據結構或對象轉換成可透過網路輕鬆傳輸或儲存在永續性儲存系統中的格式的程式。 此策略牽涉到以標準化格式表示數據,因此數據可以在接收端有效率地傳輸、處理和重建。
選取精簡、快速且適合您工作負載需求的串行化格式。
串行化格式 描述 通訊協定緩衝區 (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 Insights 和 Log Analytics。 您可以使用這些工具即時追蹤和分析程式碼的效能和行為。
識別經常性存取和優化路徑:Application Insights 和 Application Insights Profiler 可藉由分析運行時間和資源使用量,協助識別並優化程式代碼中的經常性路徑。 您可以將不必要的記憶體配置降至最低,並使用 Profiler 優化記憶體使用量。
使用正確的 SDK:Azure 提供 多種程式設計語言的 SDK,針對效能和易於使用而優化。 這些 SDK 提供預先建置的函式和連結庫,可與 Azure 服務互動,以減少自定義實作的需求。
優化網路周遊:各種 Azure 服務支援 HTTP/2 和 QUIC 等高速網路協定,以在服務和應用程式之間進行有效率的通訊。
Azure 服務,例如 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器,支援連線共用。
Azure 支援 各種服務的批處理,因此您可以將多個作業群組在一起,並在單一要求中執行。 批處理可以大幅提升效率,並減少網路負荷。
關於數據串行化,Azure 支援 各種串行化格式,包括 JSON 和 XML。 根據數據大小、效能需求和互操作性需求,選擇適當的串行化格式。
優化數據存取:Azure 提供快取服務,例如 Azure Cache for Redis。 您可以使用快取,將經常存取的數據儲存在更接近應用程式,進而加快擷取和減少後端負載。
編製索引和查詢優化:Azure SQL 資料庫 和 Azure Cosmos DB 等 Azure 服務提供索引編製功能,以優化查詢效能。 藉由選擇正確的索引編製策略和優化查詢,您可以改善數據擷取的整體效率。
對象關係型對應 (ORM):Azure 支援 Entity Framework 之類的 ORM 架構。 這些架構可簡化面向物件程式代碼與關係型或 NoSQL 資料庫之間的數據存取和對應。
優化預存程式:您可以使用 Azure SQL 資料庫 之類的 Azure 服務來建立和優化預存程式。 預存程式可以藉由減少網路來回行程和先行編譯 SQL 語句來增強效能。
數據分割和分區化:Azure 在 Azure Cosmos DB 和 Azure SQL 資料庫 等服務中提供分割和分區化功能。 您可以使用數據分割將數據分散到多個節點,以進行延展性和效能優化。
壓縮數據: Azure 服務支援 GZIP 和 DEFLATE 等數據壓縮技術。
優化架構:Azure 提供架構指引和設計模式,以設計可調整、復原且高效能的應用程式。 如需詳細資訊,請參閱 設計模式。
相關連結
- Azure 監視器
- Application Insights
- Log Analytics
- Application Insights Profiler
- 連接共用
- 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器連線共用
- Azure SQL 資料庫 索引微調
- Azure Cosmos DB 索引編製原則
- Azure Cosmos DB 數據分割
- Azure SQL 資料庫 數據分割
成本優化檢查清單
請參閱一組完整的建議。