다음을 통해 공유


GitHub Copilot Profiler 에이전트를 사용하여 앱의 성능을 분석합니다.

GitHub Copilot Profiler 에이전트는 GitHub Copilot와 함께 작동하며 성능 테스트 및 개선을 안내합니다.

이 자습서에서는 Copilot Profiler 에이전트를 사용하여 애플리케이션을 프로파일하고 성능을 향상시키는 방법을 보여 줍니다.

프로파일러 에이전트는 다음 작업을 모두 수행할 수 있습니다.

  • CPU 사용량, 메모리 할당 및 런타임 동작을 분석합니다.
  • Surface 성능 병목 현상.
  • BenchmarkDotNet 벤치마크를 생성하거나 기존 BenchmarkDotNet 벤치마크를 최적화합니다.
  • (ASP.NET) .NET 카운터를 분석합니다.
  • 제안된 최적화를 적용합니다.
  • 안내된 루프에서 향상된 기능의 유효성을 검사합니다.

프로파일러 에이전트는 다음과 같은 경우에 특히 유용합니다.

  • 프로파일링에 익숙하지 않습니다.
  • 성능 튜닝으로 시작할 위치를 잘 모를 수 있습니다.
  • 실제 벤치마크를 사용하여 최적화의 유효성을 검사하려고 합니다.
  • 게임, 서비스 또는 클라이언트 도구와 같은 고성능 앱에서 작업하고 있습니다.

코필로트의 다른 프로파일링 기능에 대한 자세한 내용은 AI 향상 시나리오를 참조하세요. 코필로트 에이전트 및 에이전트 모드에 대한 일반적인 내용은 Copilot 에이전트 모드 사용을 참조하세요.

필수 조건

시작하려면 다음이 필요합니다.

프로파일링 세션 시작

  1. Visual Studio에서 새 C# 콘솔 앱을 만듭니다.

    시작 창에서 새 프로젝트 만들기을 선택합니다. 검색 상자에 콘솔 을 입력하고 , C# 을 언어로 선택한 다음, .NET용 콘솔 앱을 선택합니다. 다음을 선택합니다. ConsoleApp_CopilotProfile 같은 프로젝트 이름을 입력하고 다음을 선택합니다. 대상 프레임워크(예: .NET 10)를 선택하고 만들기를 선택합니다.

  2. 솔루션 탐색기에서 프로젝트에서 종속성 노드를 마우스 오른쪽 단추로 클릭하고 NuGet 패키지 관리를 선택하고 EntityFramework를 검색한 다음 프로젝트에 다음 패키지를 추가합니다.

    • Microsoft.EntityFramework.Core
    • Microsoft.EntityFramework.Core.InMemory

    앱은 메모리 내 데이터베이스를 사용하여 프로젝트 설정을 간소화합니다.

  3. 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>();
    }
    
  4. 빌드 솔루션 빌드 > 를 선택하여 앱이 오류 없이 빌드되는지 확인합니다.

프로파일링 인사이트에 대한 코필로트 요청

  1. Copilot 채팅 창을 열고 다음 프롬프트를 사용합니다.

    @Profiler Please evaluate the performance of this code

  2. 보내기를 선택합니다.

    @Profiler 명령은 Copilot Profiler 에이전트를 호출합니다.

    프로파일러 에이전트를 호출하는 스크린샷

    또는 수동으로 도구 선택을 선택하고 프로파일러 에이전트를 수동으로 사용하도록 설정한 다음 에이전트 모드로 전환하여 프로파일러 에이전트를 시작할 수 있습니다. 이 메서드를 사용하면 명령을 사용할 @Profiler 필요가 없습니다.

    코필로트는 프로파일러를 실행할지 묻습니다.

    프로파일링 요청 시작 스크린샷

  3. 확인을 선택합니다.

    에이전트는 일련의 단계를 독립적으로 실행합니다. 코드를 검사하고, 프로젝트 참조 및 패키지를 포함하여 BenchmarkDotNet에 대한 프로젝트에 지원을 추가하고, 새 파일에 벤치마크를 추가하고, 생성하는 새 코드에 대한 비교 테스트를 실행합니다.

    벤치마크 결과는 출력 창에 표시되며 출력은 진단 허브로 설정됩니다.

    벤치마크 출력의 스크린샷.

    진단 세션의 결과가 .diagsession 파일 보고서에 표시됩니다. CPU 사용량을 수동으로 조사하려면 CPU 프로파일링을 사용하여 성능 분석을 참조하세요. 그러나 이 시나리오에서는 프로파일러 에이전트를 대신 사용합니다.

    테스트를 마치면 에이전트는 그 결과를 요약합니다.

    에이전트는 주로 전체 테이블 구체화 및 불필요한 메서드 호출을 제거하여 효율성 향상을% 잠재적인 33을 보고합니다 ToList() .

    테스트 결과의 스크린샷.

    또한 에이전트는 LINQ 쿼리를 최적화하는 옵션을 포함하여 다음 단계에 대한 몇 가지 제안을 제공합니다.

    코드 제안 스크린샷

    이 예제에서는 LINQ 쿼리를 최적화하는 데 집중합니다.

  4. 두 번째 Copilot 제안을 선택하고 보내기 를 선택하여 에이전트에 LINQ 쿼리 체인을 최적화하도록 지시합니다.

    에이전트는 Program.cs 업데이트하고 코드를 최적화하기 위한 추가 제안을 제공합니다. 우리는 지금 그 제안을 건너 뛸 것입니다.

  5. Program.cs 코드 변경 내용을 살펴보세요.

    코드 변경의 스크린샷.

  6. 코드 편집기의 오른쪽 아래에 있는 코드 변경 내용을 검사하고 유지 를 선택하여 유지합니다.

    최적화된 쿼리는 여기에 표시됩니다.

     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();
    
  7. 에이전트가 추가 최적화를 수행하려면 에이전트에서 제공하는 제안을 선택하거나 추가 질문을 합니다.

토큰 제한에 도달한 후 채팅 계속

프로파일러 에이전트는 채팅 스레드 연속과 함께 스마트 요약을 제공하며, 토큰 제한에 도달하여 차단되지 않고도 작업이 계속 흐르도록 설계되었습니다.

Copilot와의 채팅이 토큰 한도에 가까워지면 새 스레드에서 요약하고 계속하는 옵션이 표시됩니다.

스레드 요약의 스크린샷.

이 옵션을 선택하면 에이전트는 현재 채팅 스레드에 대한 간결하고 컨텍스트가 풍부한 요약을 자동으로 생성하여 새 대화로 전달합니다. 이렇게 하면 이전 단계로 다시 돌아가는 일을 피할 수 있습니다.