使用 GitHub Copilot 的代理程式模式重構低效能程式碼

已完成

開發人員可以使用 GitHub Copilot 的代理程式模式來安全地重構低效能程式碼,同時確保保留功能並提高程式碼品質。

備註

使用 GitHub Copilot 的 Ask 模式分析效能瓶頸並制定最佳化計劃,然後再使用 Agent 模式實施變更。 這種方法可確保重構經過深思熟慮且安全地完成。

什麼是代理程式模式?

GitHub Copilot 的代理模式會自行運作,於程式碼基底中執行複雜的重構任務。 與在聊天面板中提供指導和建議的詢問模式不同,代理模式直接在您的程式碼檔案中實作建議的更新作為編輯。

代理模式可以根據您的指示編輯檔案、套用變更、執行測試和執行命令。 它了解專案上下文並可以保持多個檔案之間的一致性,確保重構變更不會破壞現有功能。

代理模式非常適合實施需要仔細處理依賴關係、邊緣情況和測試的多步驟優化策略。 代理程式模式會自動定義所需的內容並執行必要的步驟來實現您的效能改進目標。

使用代理程式模式重構低效能程式碼

您可以使用代理程式模式來實作在詢問模式分析期間識別的最佳化策略。 代理模式可以自動執行多個重構步驟,同時保留原始功能並提高程式碼效能。

重構低效能程式碼的策略

以下是使用代理程式模式重構低效能程式碼的關鍵策略:

  • 優化數據結構: 指示代理模式用字典或哈希集等優化替代方案替換線性搜索等低效數據結構。

  • 實現快取機制:讓 Agent 模式新增智慧快取,以避免冗餘計算或昂貴的操作。

  • 消除 N+1 查詢模式: 使用 Agent 模式將多個查詢或操作合併為批次操作,以獲得更好的性能。

  • 添加非同步處理: 讓代理模式將阻塞操作轉換為非同步模式,以提高可擴展性和響應能力。

  • 降低演算法複雜性:讓代理模式重構演算法,以使用更有效率的方法和更好的時間複雜度。

  • 確保安全性:指示代理程式模式驗證效能優化不會引入安全性弱點或略過現有的安全性檢查。

  • 維護功能: 使用代理程式模式保留所有現有的業務邏輯和錯誤處理,同時改善效能特性。

代理程式模式提示重構低效能程式碼

使用代理程式模式重構低效能程式碼時,您的提示應該具體、可操作,並包含安全考量。 以下是一些自然語言文字範例,您可以在重構低效能程式碼時包含在提示中:

準備和安全

  • 「在重構之前,請建立單元測試,以驗證所選效能關鍵方法的目前行為。」
  • 分析選定代碼的安全影響,確保重構保留所有安全檢查。
  • “在對所選代碼進行任何性能優化之前,創建一個備份分支並運行現有測試。”

基本最佳化操作

  • “重構所選方法,使用字典查找而不是線性搜索來提高性能。”
  • 「透過為成本高昂的作業實作快取機制來最佳化選取的程式碼。」
  • 「將選取的 N+1 查詢模式取代為批次作業,以減少資料庫呼叫。」
  • 「將選取的封鎖作業轉換成非同步模式,以獲得更好的延展性。」

進階最佳化模式

  • “使用並行處理重構所選代碼,以提高吞吐量,同時保持線程安全。”
  • “優化所選算法,將時間複雜度從 O(n²) 降低到 O(n log n) 或更好。”
  • “用優化的集合替換選定的低效數據結構,以加快查找速度。”
  • 「重構所選程式碼,使用延遲載入模式來提升初始化效能。」

品質和驗證

  • “重構後,運行所有測試並驗證性能是否有所提高,同時保持相同的功能。”
  • “確保重構後的代碼遵循 Microsoft 的 C# 編碼約定和性能最佳實踐。”
  • 「驗證重構後的程式碼是否保持與原始實作相同的安全特性。」
  • “創建性能基準來衡量通過重構實現的改進。”

重構低效能程式碼的代理程式模式工作流程

下列工作流程示範如何使用代理程式模式安全地重構低效能程式碼:

  1. 準備您的工作區

    確保您在乾淨的 Git 分支中工作,而且所有現有的工作都已提交。 在乾淨的分支中工作可讓您在需要時輕易地還原變更。 導覽至包含您在詢問模式下分析的效能瓶頸的檔案。

  2. 設定安全措施

    在進行變更之前,請要求代理程式模式建立或執行現有的單元測試:

    在重構性能之前,先為 ProcessOrders 方法建立全面的單元測試,以驗證其當前行為。

    此步驟可確保您有一個安全網來驗證您的重構是否保留功能。

  3. 從簡單的優化步驟開始

    從低風險變更開始,例如取代線性搜尋:

    「透過將線性搜尋取代為 O(1) 效能的字典查詢,而非 O(n),以重構 GetProductById 方法。」

    代理模式分析程式碼並實作基於字典的方法,顯著提高查找效能。

  4. 實施快取策略

    繼續快取最佳化:

    「在 GetExchangeRate 方法中新增智慧型快取,以避免在短時間內對相同貨幣進行冗餘的 API 呼叫。」

    代理程式模式會建立適當的快取邏輯,減少昂貴的外部服務呼叫。

  5. 優化算法複雜性

    解決更複雜的效能問題:

    「重構 CalculateDiscounts 中的巢狀迴圈,以在單一動作中使用更有效率的演算法處理大量作業。」

    代理模式會識別低效的巢狀迴圈,並以最佳化的演算法取代它們。

  6. 驗證變更

    在每個主要重構步驟之後,驗證變更:

    「執行所有單元測試和效能基準測試,以驗證重構後的程式碼是否產生相同的結果,並改善效能。」

    代理程式模式可以執行測試並報告任何需要解決的故障。

  7. 檢閱並反覆運算

    如果發現問題,請提供具體的修復說明:

    “性能測試僅顯示邊際改進。 檢閱重構的快取邏輯,並確保有效地利用快取命中。」

    代理程式模式會分析效能指標,並進行必要的修正,以達到預期的改善。

這種結構化方法可確保安全、系統地進行效能最佳化,並在每個步驟進行驗證。

重構低效能程式碼的常見場景

檢閱常見案例可協助您瞭解如何有效地使用代理程式模式進行效能重構。

優化資料存取模式(消除 N+1 查詢)

導致 N+1 查詢的資料存取模式可能會嚴重降低效能。 重構為批次資料擷取可以顯著提高效率。

此案例可以使用下列程式碼片段來說明:

foreach (var order in orders)
{
    decimal price = GetProductPrice(order.ProductId); // database call
    order.TotalPrice = order.Quantity * price;
}

剖析分析顯示,GetProductPrice(查詢資料庫)在處理大訂單時是一個瓶頸。

您可以使用代理程式模式,透過批次產品價格查詢來重構程式碼。 例如:

代理模式提示:「最佳化此程式碼,透過批次產品價格查詢來消除 N+1 查詢模式。」

代理程式重構程式碼,如下所示:

  1. 收集所有唯一的產品 ID。
  2. 在單一資料庫呼叫中擷取價格。
  3. 將價格映射回訂單。

重構的程式碼看起來應該類似下列程式碼片段:

var productIds = orders.Select(o => o.ProductId).Distinct().ToList();
var priceCache = GetProductPrices(productIds).ToDictionary(p => p.ProductId, p => p.Price);

foreach (var order in orders)
{
    if (priceCache.TryGetValue(order.ProductId, out decimal price))
    {
        order.TotalPrice = order.Quantity * price;
    }
}

請注意下列改進:

  • 更新的程式碼會將所有必要的價格查詢批次處理到單一資料庫呼叫中。
  • 已正確維護遺漏產品的錯誤處理。
  • 程式碼會維持相同的商務邏輯,同時大幅改善效能。

取代低效演算法

用優化的數據結構替換線性搜索以獲得更好的性能。

此案例可以使用下列程式碼片段來說明:

public Product FindProductByName(string name)
{
    foreach (var product in products) // O(n) linear search
    {
        if (product.Name.Equals(name, StringComparison.OrdinalIgnoreCase))
        {
            return product;
        }
    }
    return null;
}

您可以透過為 O(1) 查詢使用字典,以使用代理程式模式來重構程式碼。 例如:

代理模式提示:「使用基於詞典的方法優化產品查詢,以達到 O(1) 效能。」

代理程式重構程式碼,如下所示:

  1. 初始化一個字典,將產品名稱映射到產品物件。
  2. 使用字典進行查找。

重構的程式碼看起來應該類似下列程式碼片段:

private readonly Dictionary<string, Product> _productsByName = 
    products.ToDictionary(p => p.Name, StringComparer.OrdinalIgnoreCase);

public Product FindProductByName(string name)
{
    _productsByName.TryGetValue(name, out Product product);
    return product;
}

請注意下列改進:

  • 查找時間複雜度從 O(n) 提高到 O(1)。
  • 使用適當的比較器保留字串比較邏輯。
  • 初始化成本會在多個查询作業中分攤。

實作非同步處理

將封鎖作業轉換成非同步模式,以獲得更好的延展性。 重構同步程式碼以使用非同步程式設計可以提高回應能力和可擴展性。

此案例可以使用下列程式碼片段來說明:

public void ProcessOrderNotification(Order order)
{
    var emailContent = GenerateEmailContent(order);
    Thread.Sleep(1000); // simulate email service delay
    SendEmail(order.CustomerEmail, emailContent);
}

您可以使用代理程式模式,將程式碼轉換為非同步模式,以重構程式碼。 例如:

代理模式提示:「將此同步電子郵件處理轉換為非同步,以提高可擴展性和回應能力。」

代理程式重構程式碼,如下所示:

  1. 讓方法非同步。
  2. 使用 await 以進行非同步作業。

重構的程式碼看起來應該類似下列程式碼片段:

public async Task ProcessOrderNotificationAsync(Order order)
{
    var emailContent = await GenerateEmailContentAsync(order);
    await Task.Delay(1000); // simulate async email service delay
    await SendEmailAsync(order.CustomerEmail, emailContent);
}

請注意下列改進:

  • 所有呼叫者都已更新,以等待非同步方法。
  • 非同步模式會在整個呼叫鏈結中一致套用。
  • 已在需要時適當地實作錯誤處理和取消權杖。

安全性和品質考量

使用代理程式模式進行效能重構時,請務必考慮安全性和品質影響:

安全性最佳做法

進行效能重構時,請務必考慮以下安全性做法:

  • 驗證輸入處理: 確保性能優化不會繞過輸入驗證或引入注入漏洞。

  • 保留授權檢查: 確認安全相關的驗證在優化期間沒有意外刪除或削弱。

  • 安全快取做法:確保快取資料不會暴露敏感資訊或建立未經授權的存取路徑。

  • 維護稽核追蹤:確保在效能改進期間保留日誌記錄和監控邏輯。

程式碼品質標準

企業通常採用一套特定的編碼標準。 如果您沒有指導方針,Microsoft 會發佈您可以遵循的 C# 編碼慣例的建議。

遵循以下準則來保持高程式碼品質:

  • 遵循既定模式: 確保重構後的代碼遵循您團隊的編碼標準和架構模式。

  • 保持可讀性: 驗證優化的代碼是否保持可讀性和可維護性,即使性能改進。

  • 保留錯誤處理: 確保在效能最佳化期間維護所有錯誤處理邏輯。

  • 記錄複雜的優化: 添加評論,解釋非明顯的性能優化,供未來的維護者使用。

代理程式模式安全指導方針

代理程式模式功能強大,但需要仔細監督:

重構之前

  • 始終在功能分支中工作。
  • 確保存在全面的測試涵蓋範圍。
  • 檢閱詢價模式分析中的最佳化計劃。
  • 了解效能特性和業務邏輯。

重構期間

  • 進行漸進式變更,而不是大型轉換。
  • 在繼續下一個步驟之前,請先驗證每個最佳化步驟。
  • 檢閱產生的程式碼,以確保正確性並尋求效能的提升。
  • 頻繁地測試以及早發現迴歸。

重構後

  • 執行全面的效能基準測試,包括基準線比較。
  • 與團隊成員一起執行程式碼審查。
  • 驗證安全性和功能特性。
  • 更新文件以反映效能改進。

把特工模式當作得力助手

雖然代理模式可以執行複雜的效能最佳化,但它需要人工監督:

  • 在接受所有變更之前,請先檢閱所有變更。
  • 驗證效能改善是可衡量且顯著的。
  • 確保滿足安全性和功能要求。
  • 徹底測試以捕捉細微的行為變化。

代理程式模式可加速效能最佳化,但並不能取代仔細檢閱、測試和測量的需求。

總結

使用 GitHub Copilot 的代理模式,開發人員能夠有效率地重構低效能程式碼,同時保持程式碼品質和功能。 透過將詢問模式的分析見解與代理程式模式的執行功能相結合,您可以系統地提高應用程式效能、可擴展性和效率。 成功的關鍵是提供明確的說明、維護安全實踐以及透過全面的測試和性能測量徹底驗證所有變更。