Рефакторинг кода низкой производительности с помощью режима агента GitHub Copilot
Разработчики могут использовать режим агента GitHub Copilot для безопасного рефакторинга кода с низкой производительностью, обеспечивая сохранение функциональных возможностей и улучшение качества кода.
Замечание
Используйте режим запроса GitHub Copilot, чтобы проанализировать узкие места производительности и сформулировать план оптимизации перед использованием режима агента для реализации изменений. Такой подход гарантирует, что рефакторинг выполняется тщательно и безопасно.
Что такое режим агента?
Режим агента GitHub Copilot работает автономно для выполнения сложных задач рефакторинга в базе кода. В отличие от режима ask, который предоставляет рекомендации и предложения на панели чата, режим агента реализует предлагаемые обновления в виде изменений непосредственно в файлах кода.
Режим агента может изменять файлы, применять изменения, выполнять тесты и выполнять команды на основе ваших инструкций. Он понимает контекст проекта и может поддерживать согласованность между несколькими файлами. Гарантируя, что изменения рефакторинга не нарушат существующие функциональные возможности.
Режим агента идеально подходит для реализации стратегий многофакторной оптимизации, требующих тщательной обработки зависимостей, пограничных вариантов и тестирования. Режим агента автоматически определяет необходимый контекст и выполняет необходимые шаги для достижения целей повышения производительности.
Рефакторинг кода с низкой производительностью с помощью режима агента
Вы можете использовать режим агента для реализации стратегий оптимизации, определенных во время анализа режима ask. Режим агента может выполнять несколько шагов рефакторинга автоматически, сохраняя исходные функциональные возможности и повышая производительность кода.
Стратегии рефакторинга кода с низкой производительностью
Ниже приведены ключевые стратегии использования режима агента для рефакторинг кода с низкой производительностью:
Оптимизация структур данных: режим инструктирования агента для замены неэффективных структур данных, таких как линейный поиск оптимизированными альтернативами, такими как словари или хэш-наборы.
Реализуйте механизмы кэширования: обеспечьте, чтобы режим агента добавлял интеллектуальное кэширование для избежания избыточных вычислений или дорогостоящих операций.
Устранение шаблонов запросов N+1. Использование режима агента для консолидации нескольких запросов или операций в пакетные операции для повышения производительности.
Добавление асинхронной обработки. Разрешить режиму агента преобразовывать блокирующие операции в асинхронные шаблоны, которые повышают масштабируемость и скорость реагирования.
Уменьшение алгоритмической сложности: Используйте режим агента для рефакторинга алгоритмов, чтобы применять более эффективные подходы с лучшей временной сложностью.
Обеспечение безопасности: Включите режим агента, чтобы удостовериться, что оптимизация производительности не приводит к появлению уязвимостей в безопасности и не обходит существующие проверки безопасности.
Поддержка функций: используйте режим агента для сохранения всех существующих бизнес-логики и обработки ошибок при улучшении характеристик производительности.
Режим агента запрашивает рефакторинг кода с низкой производительностью
При использовании режима агента для рефакторинга кода с низкой производительностью запросы должны быть конкретными, действенными и включать рекомендации по безопасности. Ниже приведены некоторые примеры текста естественного языка, которые можно включить в запрос при рефакторинге кода с низкой производительностью:
Подготовка и безопасность
- "Перед рефакторингом создайте модульные тесты, которые проверяют текущее поведение выбранных методов, критически важных для производительности".
- Анализировать выбранный код на предмет безопасности и убедитесь, что рефакторинг сохраняет все проверки безопасности.
- Создайте резервную ветку и выполните существующие тесты перед улучшением производительности выбранного кода.
Основные операции оптимизации
- Преобразуйте выбранный метод для использования поиска словаря вместо линейного поиска для повышения производительности.
- "Оптимизация выбранного кода путем реализации механизмов кэширования для дорогостоящих операций".
- "Замените выбранный шаблон запроса N+1 пакетными операциями, чтобы уменьшить вызовы базы данных".
- "Преобразуйте выбранные блокирующие операции в асинхронные шаблоны для повышения масштабируемости".
Расширенные шаблоны оптимизации
- "Рефакторинг выбранного кода с помощью параллельной обработки для повышения пропускной способности при сохранении безопасности потоков".
- "Оптимизируйте выбранный алгоритм, чтобы уменьшить сложность от O(n 2) до O(n log n) или лучше".
- "Замените выбранную неэффективную структуру данных оптимизированными коллекциями для ускорения поиска".
- Преобразуйте выбранный код для использования ленивой загрузки, чтобы улучшить производительность инициализации.
Качество и проверка
- "После рефакторинга запустите все тесты и убедитесь, что производительность улучшилась при сохранении идентичных функциональных возможностей".
- "Убедитесь, что рефакторинговый код следует соглашениям по программированию на C# Корпорации Майкрософт и рекомендациям по повышению производительности".
- "Убедитесь, что рефакторинговый код поддерживает те же характеристики безопасности, что и исходная реализация".
- "Создайте тесты производительности для измерения улучшения, достигнутого путем рефакторинга".
Рабочий процесс режима агента для рефакторинга кода с низкой производительностью
В следующем рабочем процессе показано, как использовать режим агента для безопасного рефакторинга кода с низкой производительностью:
Подготовка рабочей области
Убедитесь, что вы работаете в чистой ветви Git и все существующие работы зафиксированы. Работа в чистой ветви позволяет легко вернуть изменения при необходимости. Перейдите к файлу с узкими местами производительности, которые вы проанализировали в режиме ask.
Настройка мер безопасности
Перед внесением изменений попросите режим агента создать или запустить существующие модульные тесты:
Создайте комплексные модульные тесты для метода
ProcessOrders, чтобы проверить текущее поведение перед рефакторингом для улучшения производительности.Этот шаг гарантирует, что у вас есть сеть безопасности, чтобы убедиться, что рефакторинг сохраняет функциональные возможности.
Начните с простых шагов оптимизации
Начните с изменений низкого риска, таких как замена линейных поисковых запросов:
"Рефакторинг
GetProductByIdметода путем замены линейного поиска на поиск словаря производительности O(1) вместо O(n)."Режим агента анализирует код и реализует подход на основе словаря, значительно повышая производительность поиска.
Реализация стратегий кэширования
Продолжить оптимизацию кэширования:
Добавьте интеллектуальное кэширование в метод
GetExchangeRate, чтобы избежать избыточных вызовов API для однотипной валюты в течение короткого периода времени.Режим агента создает соответствующую логику кэширования, уменьшая затраты на вызовы внешних служб.
Оптимизация алгоритмической сложности
Устранение более сложных проблем с производительностью:
Рефакторируйте вложенный цикл в
CalculateDiscounts, чтобы использовать более эффективный алгоритм, который обрабатывает объемные операции за один проход.Режим агента определяет неэффективные вложенные циклы и заменяет их оптимизированными алгоритмами.
Проверка изменений
После каждого крупного шага рефакторинга, проверьте изменения.
"Запустите все модульные тесты и тесты производительности, чтобы убедиться, что рефакторинговый код выдает идентичные результаты с улучшенной производительностью".
Режим агента может выполнять тесты и сообщать о любых сбоях, которые необходимо устранить.
Проверяйте и итерайте
Если обнаружены проблемы, укажите конкретные инструкции по исправлению:
"Тест производительности показывает только незначительное улучшение. Просмотрите рефакторинг логики кэширования и убедитесь, что кэш-хиты используются эффективно.
Режим агента анализирует метрики производительности и вносит необходимые исправления для достижения ожидаемых улучшений.
Этот структурированный подход гарантирует безопасное и систематическое выполнение оптимизации производительности с проверкой на каждом шаге.
Распространенные сценарии рефакторинга кода с низкой производительностью
Просмотр распространенных сценариев поможет понять, как эффективно использовать режим агента для рефакторинга производительности.
Оптимизация шаблонов доступа к данным (устранение запросов N+1)
Шаблоны доступа к данным, которые приводят к возникновению запросов типа N+1, могут значительно ухудшить производительность. Рефакторинг для пакетного извлечения данных может значительно повысить эффективность.
Этот сценарий можно проиллюстрировать с помощью следующего фрагмента кода:
foreach (var order in orders)
{
decimal price = GetProductPrice(order.ProductId); // database call
order.TotalPrice = order.Quantity * price;
}
Анализ профилирования показывает, что GetProductPrice (который запрашивает базу данных) является узким местом при обработке больших заказов.
Вы можете использовать режим агента для рефакторинга кода путем пакетного поиска цен на продукт. Рассмотрим пример.
Запрос режима агента: "Оптимизация этого кода для устранения шаблона запроса N+1 путем пакетного поиска цен на продукт".
Агент рефакторингирует код следующим образом:
- Соберите все уникальные идентификаторы продуктов.
- Получите цены за один запрос к базе данных.
- Сопоставьте цены с заказами.
Рефакторинг кода должен выглядеть примерно так, как показано в следующем фрагменте кода:
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;
}
Вы можете использовать режим Agent, чтобы рефакторить код с помощью словаря для выполнения операций поиска за O(1). Рассмотрим пример.
Запрос режима агента: "Оптимизация поиска продуктов с помощью словарного подхода для производительности O(1)."
Агент рефакторингирует код следующим образом:
- Инициализируйте словарь, отображающий имена продуктов на объекты продуктов.
- Используйте словарь для поиска значений.
Рефакторинг кода должен выглядеть примерно так, как показано в следующем фрагменте кода:
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);
}
Режим агента можно использовать для рефакторинга кода, преобразовав его в асинхронный шаблон. Рассмотрим пример.
Запрос режима агента: "Преобразуйте синхронную обработку электронной почты в асинхронную, чтобы повысить масштабируемость и скорость реагирования".
Агент рефакторингирует код следующим образом:
- Сделайте метод асинхронным.
- Используется
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);
}
Обратите внимание на следующие улучшения:
- Все вызывающие обновляются для ожидания асинхронного метода.
- Асинхронный шаблон последовательно применяется во всей цепочке вызовов.
- Обработка ошибок и токены отмены должным образом реализованы там, где это необходимо.
Вопросы безопасности и качества
При использовании режима агента для рефакторинга производительности всегда учитывайте последствия безопасности и качества:
Рекомендации по обеспечению безопасности
При рефакторинге кода для повышения производительности рассмотрите следующие практики безопасности:
Проверка обработки входных данных. Убедитесь, что оптимизации производительности не обходят проверку входных данных или не вводят уязвимости внедрения.
Сохранение проверок авторизации. Убедитесь, что проверки, связанные с безопасностью, не удаляются или ослабляются во время оптимизации.
Безопасные методы кэширования. Убедитесь, что кэшированные данные не предоставляют конфиденциальную информацию или создают несанкционированные пути доступа.
Поддержка следов аудита: Убедитесь, что логика ведения журнала и мониторинга сохраняется при улучшении производительности.
Стандарты качества кода
Как правило, предприятия принимают определенный набор стандартов кодирования. Если у вас нет рекомендаций, корпорация Майкрософт публикует рекомендации по соглашениям по написанию кода на C#, которые можно следовать.
Поддерживайте высокое качество кода, следуя приведенным ниже рекомендациям:
Следуйте установленным шаблонам: убедитесь, что рефакторинг кода соответствует стандартам кодирования и архитектурным шаблонам вашей команды.
Поддержка удобочитаемости. Убедитесь, что оптимизированный код остается доступным для чтения и обслуживания, даже при улучшении производительности.
Сохранение обработки ошибок: Убедитесь, что вся логика обработки ошибок сохраняется в процессе оптимизации производительности.
Комплексные оптимизации: Добавьте комментарии, объясняющие неочевидные оптимизации производительности для будущих разработчиков.
Рекомендации по безопасности режима агента
Режим агента мощный, но требует тщательного надзора:
Перед рефакторингом
- Всегда работайте в функциональной ветке.
- Убедитесь, что имеется всестороннее покрытие тестов.
- Просмотрите план оптимизации по результатам анализа режима Ask.
- Поймите характеристики производительности и бизнес-логику.
Во время рефакторинга
- Внесите добавочные изменения, а не большие преобразования.
- Проверьте каждый шаг оптимизации, прежде чем перейти к следующему.
- Просмотрите созданный код для улучшения правильности и производительности.
- Тестируйте часто, чтобы поймать регрессии раньше.
После рефакторинга
- Запустите комплексные тесты производительности, включая базовые сравнения.
- Выполните проверку кода с участниками команды.
- Проверьте характеристики безопасности и функциональности.
- Обновите документацию, чтобы отразить улучшения производительности.
Рассматривать режим агента как мощный помощник
Хотя режим агента может выполнять сложные оптимизации производительности, он требует контроля над человеком:
- Перед принятием всех изменений просмотрите все изменения.
- Проверьте, являются ли улучшения производительности измеримыми и значительными.
- Убедитесь, что выполнены требования к безопасности и функциональности.
- Тщательно протестируйте, чтобы поймать тонкие изменения поведения.
Режим агента ускоряет оптимизацию производительности, но не заменяет необходимость тщательной проверки, тестирования и измерения.
Сводка
Использование режима агента GitHub Copilot позволяет разработчикам эффективно переписывать низкопроизводительный код, одновременно сохраняя его качество и функциональность. Объединение аналитических сведений из режима Ask с возможностями выполнения режима Agent позволяет систематически повышать производительность приложений, масштабируемость и эффективность. Ключом к успеху является предоставление четких инструкций, поддержание практик безопасности и тщательное тестирование всех изменений с помощью комплексного тестирования и измерения производительности.