Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Агент профилировщика GitHub Copilot работает вместе с GitHub Copilot и поможет вам проверить и улучшить производительность.
В этом руководстве показано, как профилировать приложения и повысить производительность с помощью агента Профилировщика Copilot.
Агент профилировщика может выполнять все следующие задачи.
- Анализ использования ЦП, выделения памяти и поведения среды выполнения.
- Узкие места производительности поверхности.
- Создайте тесты BenchmarkDotNet или оптимизируйте существующие тесты BenchmarkDotNet.
- (ASP.NET) Анализируйте счетчики .NET.
- Применение предлагаемых оптимизаций.
- Проверьте улучшения в направляемом цикле.
- Обнаруживайте и используйте модульные тесты C++, которые используют пути кода, критически важные для производительности, или создавайте новые тесты C++ при необходимости.
- Создайте легковесные артефакты измерения для фиксации базовых метрик, если подходящих тестов или эталонов не существует.
Агент профилировщика особенно полезен, когда:
- Вы не знакомы с профилированием.
- Вы не уверены, где начать с настройки производительности.
- Вы хотите проверить оптимизацию с помощью реальных тестов.
- Вы работаете над высокопроизводительные приложения, такие как игры, службы или клиентские инструменты.
- Вы работаете с проектами на C++, где эталоны не являются практичными, но модульные тесты уже существуют.
- Вы хотите использовать тесты, которые команда уже выполняет для проверки производительности.
Для получения информации о других функциях профилирования в Copilot см. в разделе о расширенных ИИ-сценариях. Общие сведения об агентах Copilot и режиме агента см. в разделе "Использование режима агента Copilot".
Предпосылки
Чтобы начать, вам нужно:
- Visual Studio 2022 версии 17.14 или более поздней версии
-
Войдите в Visual Studio с помощью учетной записи GitHub с доступом к Copilot
** Вы можете использовать GitHub Copilot бесплатно. Зарегистрируйте и используйте ИИ, чтобы быстрее и эффективнее кодировать.
Запуск сеанса профилирования
В Visual Studio создайте консольное приложение C#.
В окне запуска нажмите кнопку "Создать проект". Введите консоль в поле поиска, выберите язык C# и выберите консольное приложение для .NET. Нажмите кнопку Далее. Введите имя проекта, например ConsoleApp_CopilotProfile , и нажмите кнопку "Далее". Выберите целевую платформу (например, .NET 10) и нажмите кнопку "Создать".
В обозревателе решений щелкните правой кнопкой мыши узел зависимостей в проекте, выберите "Управление пакетами NuGet", выполните поиск EntityFramework и добавьте в проект следующие пакеты:
- Microsoft.EntityFramework.Core
- Microsoft.EntityFramework.Core.InMemory
Приложение использует базу данных в памяти для упрощения настройки проекта.
Замените код в Program.cs следующим кодом:
using System.Diagnostics; using Microsoft.EntityFrameworkCore; // Configure EF Core to use the InMemory provider var options = new DbContextOptionsBuilder<AppDbContext>() .UseInMemoryDatabase("PerfDemoDb") .Options; using var db = new AppDbContext(options); // Seed 100,000 records once if (!db.People.Any()) { var rand = new Random(42); var cities = new[] { "Chicago", "Seattle", "Cairo", "London", "Paris", "Cleveland", "Calgary", "Dallas", "Berlin", "Copenhagen" }; var people = Enumerable.Range(1, 100_000).Select(i => new Person { Name = $"Person {i}", Age = rand.Next(18, 80), City = cities[rand.Next(cities.Length)] }); db.People.AddRange(people); db.SaveChanges(); } Console.WriteLine($"Seeded records: {db.People.Count():N0}"); // Inefficient LINQ pattern: materialize everything and repeatedly re-materialize + chain ToList // This simulates client-heavy work that doesn't scale, even with in-memory provider var sw = Stopwatch.StartNew(); // Full materialization of all rows var all = db.People.ToList(); // Extra ToList calls create multiple large intermediate lists var inefficient = all .Where(p => p.Age > 50) .ToList() .Where(p => p.City.StartsWith("C")) .ToList() .Select(p => p.Name) .Distinct() .OrderBy(n => n) .Take(10) .ToList(); sw.Stop(); Console.WriteLine($"Inefficient query returned {inefficient.Count} rows in {sw.ElapsedMilliseconds} ms"); // EF Core entity public class Person { public int Id { get; set; } public string Name { get; set; } = string.Empty; public int Age { get; set; } public string City { get; set; } = string.Empty; } // EF Core DbContext public class AppDbContext : DbContext { public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { } public DbSet<Person> People => Set<Person>(); }Выберите Сборка -> Сборка решения>, чтобы убедиться, что приложение собирается без ошибок.
Попросите Copilot предоставить информацию о профилировании
Откройте окно Copilot Chat и используйте следующий запрос.
@Profiler Please evaluate the performance of this codeВыберите Отправить.
Команда
@Profilerвызывает агента Профилировщика Копилот.
Кроме того, можно запустить агент профилировщика вручную, выбрав "Выбрать инструменты " и вручную включив агент профилировщика, а затем переключившись в режим агента. Используя этот метод, вам не нужно использовать
@Profilerкоманду.Copilot спрашивает, хотите ли вы запустить профилировщик.
Нажмите кнопку "Подтвердить".
Агент самостоятельно выполняет ряд шагов. Он проверяет код, добавляет поддержку проекта для BenchmarkDotNet, включая ссылки на проекты и пакеты, добавляет тесты тестирования в новый файл и запускает тест сравнения с новым кодом, который он создает.
Результаты теста отображаются в окне вывода с выходными данными, установленными в Центре диагностики.
Результаты сеанса диагностики отображаются в отчете файла diagsession . Если вы хотите вручную изучить использование ЦП, см. статью "Анализ производительности с помощью профилирования ЦП". Однако в этом сценарии мы используем Profiler Agent.
По завершении тестирования агент суммирует свои результаты.
Агент сообщает о потенциальном увеличении эффективности на 33%, главным образом путем удаления полной материализации таблиц и ненужного вызова метода
ToList().
Агент также предоставляет несколько предложений для дальнейших действий, включая вариант оптимизации запроса LINQ.
В этом примере основное внимание уделяется оптимизации запроса LINQ.
Выберите второе предложение Copilot и нажмите кнопку "Отправить ", чтобы сообщить агенту, чтобы оптимизировать цепочку запросов LINQ.
Агент обновляет Program.cs и предоставляет дополнительные предложения по оптимизации кода. Сейчас мы пропустим эти предложения.
Ознакомьтесь с изменениями кода в Program.cs.
В правом нижнем углу редактора кода проверьте изменения кода и нажмите кнопку "Сохранить ".
Здесь показан оптимизированный запрос.
var optimized = db.People .AsNoTracking() .Where(p => p.Age > 50 && p.City.StartsWith("C")) .Select(p => p.Name) .Distinct() .OrderBy(n => n) .Take(10) .ToList();Если вы хотите, чтобы агент выполнил дополнительные оптимизации, выберите предложения, которые предлагает агент, или задайте дополнительные вопросы.
Продолжение чата после достижения лимита токенов
Агент профилировщика предоставляет умное резюмирование и продление истории чата, предназначенное для поддержания рабочего потока без блокировок из-за ограничения токенов.
Если чат с Copilot приближается к его лимиту токенов, вам будет предложено подвести итоги и продолжить в новой ветке.
Если вы выберете этот параметр, агент автоматически создает краткую, многофункциональную контекстную сводку текущего потока чата и переносит ее в новую беседу. Это позволяет избежать повторения каких-либо шагов.