Поделиться через


Анализ данных BenchmarkDotNet в Visual Studio

Средства профилирования можно использовать для сбора и просмотра данных BenchmarkDotNet в Visual Studio. BenchmarkDotNet — это библиотека .NET с открытым кодом, предназначенная для оценки производительности. Он автоматизирует процесс измерения и сравнения времени выполнения, использования памяти и других метрик производительности кода .NET в надежном и повторяемом способе.

Вы используете BenchmarkDotNet, устанавливая необходимые пакеты NuGet в проекте, а затем добавляя атрибуты в код, соответствующий типу интересующей вас информации о производительности.

Предпосылки

  • Visual Studio 2022 версии 17.9 или более поздней

  • Проект теста должен включать следующие два пакета NuGet:

    При использовании шаблона проекта Benchmark эти пакеты NuGet присутствуют при создании проекта.

Настройка проекта

Атрибуты теста должны быть добавлены в консольное приложение .NET. Атрибуты можно добавить в функции-оболочки, ссылающиеся на другие типы проектов.

Чтобы подготовить проект к поддержке BenchmarkDotNet, используйте один из следующих методов:

  • Откройте существующий проект консоли или создайте новый консольный проект. В этом сценарии вы вручную добавите поддержку BenchmarkDotNet.

  • Используйте шаблон проекта Benchmark . Некоторые шаги, описанные в этой статье, необходимы только при добавлении поддержки BenchmarkDotNet вручную.

    Шаблон проекта Benchmark создает полностью интегрированный проект BenchmarkDotNet со встроенной поддержкой профилирования использования ЦП и аналитики Copilot. Чтобы использовать шаблон, выберите профилирование из списка типов проектов при создании нового проекта, а затем выберите "Тест проекта". Сведения о том, как атрибутировать код, см. в разделе Attribute your code.

Снимок экрана: шаблон BenchmarkDotNet в Visual Studio.

Создайте консольный проект или используйте существующий консольный проект.

Атрибуты теста должны быть добавлены в консольное приложение .NET. Атрибуты можно добавить в функции-оболочки, ссылающиеся на другие типы проектов.

Укажите авторство вашего кода

При добавлении средства диагностики BenchmarkDotNet в классы бенчмарка в качестве атрибута приложение настраивается для создания файла .diagsession после выполнения бенчмарков. Затем можно открыть файл diagsession в Visual Studio и просмотреть данные профилирования для тестов.

Поддерживаются следующие средства диагностики:

  • CPUUsageDiagnoser
  • DatabaseDiagnoser
  • DotNetCountersDiagnoser
  • EventsDiagnoser
  • FileIODiagnoser

Каждое средство диагностики создает данные о производительности, связанные с этим диагностическим средством. Например, CPUUsageDiagnoser создает файл .diagsession с данными о ЦП, а DatabaseDiagnoser создает файл .diagsession с данными об операциях базы данных. Ограничения соответствуют связанному инструменту профилирования. Например, средство базы данных профилировщика работает на ADO.NET или Entity Framework Core.

Чтобы атрибутировать код для диагностических и тестовых показателей, выполните следующее:

  1. Добавьте имя средства диагностики в качестве атрибута в класс, содержащий тесты, для которых требуется создать данные.

  2. Добавьте атрибут Benchmark к методам, которые требуется протестировать на производительность.

    Например, можно использовать следующий код для диагноста использования ЦПУ.

    Если вы используете шаблон проекта Benchmark , пример кода уже представлен в шаблоне. Если вы вручную добавляете поддержку BenchmarkDotNet, можно использовать следующий пример кода.

    using System;
    using System.Security.Cryptography;
    using BenchmarkDotNet.Attributes;
    using BenchmarkDotNet.Running;
    using Microsoft.VSDiagnostics;
    
    namespace MyBenchmarks
    {
        [CPUUsageDiagnoser]
        public class Md5VsSha256
        {
            private const int N = 10000;
            private readonly byte[] data;
    
            private readonly SHA256 sha256 = SHA256.Create();
            private readonly MD5 md5 = MD5.Create();
    
            public Md5VsSha256()
            {
                data = new byte[N];
                new Random(42).NextBytes(data);
            }
    
            [Benchmark]
            public byte[] Sha256() => sha256.ComputeHash(data);
    
            [Benchmark]
            public byte[] Md5() => md5.ComputeHash(data);
        }
    
        public class Program
        {
            public static void Main(string[] args)
            {
                var summary = BenchmarkRunner.Run(typeof(Program).Assembly);
            }
        }
    }
    

Сбор и просмотр данных Benchmark.NET

  1. Задайте сборку выпуска вместо отладочной сборки.

  2. Запустите приложение, чтобы создать файл diagsession .

    Проверьте выходные данные консоли, чтобы получить расположение файла. Рассмотрим пример.

    // * Diagnostic Output - VSDiagnosticsDiagnoser * 
    Collection result moved to 'BenchmarkDotNet_Md5VsSha256_20231218_123326.diagsession'.
    Session : {7f38bcc2-c692-4266-aa24-b12bc5325ea4}
      Stopped
    Exported diagsession file: *.diagsession
    
  3. В Visual Studio выберите Файл > Открыть > Файл и перейдите к расположению .diagsession файла, а затем выберите и откройте файл.

  4. Перейдите на вкладку Benchmarks , чтобы просмотреть данные для тестов BenchmarkDotNet.

    Снимок экрана: данные BenchmarkDotNet в Visual Studio.

    Дополнительные сведения о результатах на закладке "Тесты" см. в документации BenchmarkDotNet.

  5. Щелкните правой кнопкой мыши строку в результатах и выберите диапазон времени , чтобы синхронизировать график временной шкалы с тестом.

  6. Выберите одну из доступных вкладок, таких как использование ЦП или выделение ресурсов.

    В зависимости от средства диагностики, используемого для сбора данных, можно получить аналитические сведения, связанные с выделением памяти, использованием ЦП, счетчиками и другими данными о производительности. Чтобы проанализировать выделение памяти, используйте встроенный атрибут MemoryDiagnoser , добавив атрибут [MemoryDiagnoser]. Дополнительные сведения см. в разделе "Диагностика".

    Замечание

    Профилировщик поддерживает только [MemoryDiagnoser] и диагностические средства, перечисленные ранее в этой статье.

    Пример использования профилировщика для анализа выделения памяти см. в записи блога о тестировании с помощью Visual Studio Profiler.

    Чтобы проанализировать данные, связанные с другими вкладками, такими как использование ЦП, см. соответствующие статьи в документации по профилированию.

Оптимизация с помощью Copilot

Вы можете активировать оптимизацию распределения ЦП и памяти для тестов BenchmarkDotNet непосредственно из редактора с помощью CodeLens. Это делает настройку производительности более доступной и простой, помогая находить и устранять проблемы выделения ЦП и памяти прямо в коде.

Выберите индикатор CodeLens над контрольной точкой, а затем выберите параметр Оптимизировать выделение с помощью Copilot.

Снимок экрана: оптимизация с помощью Copilot.