Добавить в корзинуПозвонить
Найти в Дзене
IT WORLD

Как протестировать код C# с помощью BenchmarkDotNet

Воспользуйтесь преимуществами легкой библиотеки BenchmarkDotNet с открытым исходным кодом, чтобы протестировать свои методы и отслеживать их производительность. BenchmarkDotNet — это легкая, мощная библиотека .NET с открытым исходным кодом, которая может преобразовать ваши методы в тесты, отслеживать эти методы, а затем предоставлять ценную информацию о собранных данных о производительности. Написать тесты BenchmarkDotNet легко, а результаты процесса тестирования также удобны для пользователя. Вы можете воспользоваться BenchmarkDotNet для тестирования приложений .NET Framework и .NET Core. В этой статье мы рассмотрим, как работать с BenchmarkDotNet в .NET Core. Создайте проект консольного приложения в Visual Studio Прежде всего давайте создадим проект консольного приложения .NET Core в Visual Studio 2019. 1) Запустите интегрированную среду разработки Visual Studio. 2) Нажмите «Создать новый проект». 3) В окне «Создать новый проект» выберите «Консольное приложение (.NET C
Оглавление

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

BenchmarkDotNet — это легкая, мощная библиотека .NET с открытым исходным кодом, которая может преобразовать ваши методы в тесты, отслеживать эти методы, а затем предоставлять ценную информацию о собранных данных о производительности. Написать тесты BenchmarkDotNet легко, а результаты процесса тестирования также удобны для пользователя.

Вы можете воспользоваться BenchmarkDotNet для тестирования приложений .NET Framework и .NET Core. В этой статье мы рассмотрим, как работать с BenchmarkDotNet в .NET Core.

Создайте проект консольного приложения в Visual Studio

Прежде всего давайте создадим проект консольного приложения .NET Core в Visual Studio 2019.

1) Запустите интегрированную среду разработки Visual Studio.

2) Нажмите «Создать новый проект».

3) В окне «Создать новый проект» выберите «Консольное приложение (.NET Core)» из списка отображаемых шаблонов.

4) Нажмите "Далее.

5) В показанном ниже окне «Настройка нового проекта» укажите имя и местоположение нового проекта.

6) Нажмите Создать.

В результате будет создан новый проект консольного приложения .NET Core в Visual Studio 2019. Обратите внимание, что при создании проекта консольного приложения класс Program (автоматически сгенерированный в файле Program.cs) будет выглядеть следующим образом:

-2

Мы будем использовать этот проект и класс Program для работы с BenchmarkDotNet в последующих разделах этой статьи.

Установите пакет NuGet BenchmarkDotNet

Для работы с BenchmarkDotNet необходимо установить пакет BenchmarkDotNet. Вы можете сделать это либо через диспетчер пакетов NuGet внутри интегрированной среды разработки Visual Studio 2019, либо выполнив следующую команду в консоли диспетчера пакетов NuGet:

-3

Зачем нужен benchmark?

Benchmark — это измерение или набор измерений, связанных с производительностью фрагмента кода в приложении. Бенчмаркинг необходим для понимания показателей производительности методов вашего приложения. Всегда полезно иметь под рукой метрики при оптимизации кода. Нам очень важно знать, улучшили или ухудшили производительность внесенные в код изменения. Бенчмаркинг также помогает вам выделить те части кода приложения, которые нуждаются в рефакторинге.

Шаги по тестированию кода с использованием BenchmarkDotNet

Чтобы запустить BenchmarkDotNet в приложении .NET Framework или .NET Core, необходимо выполнить следующие действия:

1) Добавьте необходимый пакет NuGet.

2) Добавьте атрибуты Benchmark в свои методы.

3) Создайте экземпляр BenchmarkRunner.

4) Запустите приложение в режиме Release.

Создайте benchmarking класс в .NET Core

Откройте файл Program.cs и напишите туда следующий код.

-4

Приведенная выше программа иллюстрирует, как можно писать методы для анализа производительности. Обратите внимание на использование атрибута Benchmark поверх каждого метода, который необходимо протестировать.

В методе Main файла Program.cs необходимо указать начальную отправную точку — класс BenchmarkRunner. Это способ сообщить BenchmarkDotNet о необходимости проведения тестов для указанного класса. Итак, замените код метода Main по умолчанию в файле Program.cs, используя следующий фрагмент кода.

-5

Запустите benchmark в своем приложении .NET Core

Если вы запустите приложение в режиме отладки, вы увидите следующее сообщение об ошибке:

Запуск benchmark кода в режиме отладки приведет к ошибке
Запуск benchmark кода в режиме отладки приведет к ошибке

При проведении бенчмаркинга всегда следует следить за тем, чтобы проект запускался в режиме release. Причина в том, что во время компиляции код оптимизируется по-разному для режимов отладки и для режима релиза. Компилятор C# выполняет в режиме релиза несколько оптимизаций, которые недоступны в режиме отладки.

Следовательно, вам следует запускать свой проект только в режиме релиза. Чтобы запустить тестирование производительности, укажите следующую команду в командной строке Visual Studio.

-7

Для достижения наилучших результатов перед запуском тестов следует убедиться, что все приложения закрыты и все ненужные процессы остановлены.

Обратите внимание: если вы не укажете параметр конфигурации, среда выполнения попытается выполнить тестирование неоптимизированного кода в режиме отладки. И вы увидите ту же ошибку, что и ранее.

Анализ результатов бенчмаркинга

После завершения процесса бенчмаркинга в окне консоли отобразится сводка результатов. Сводный раздел содержит информацию, относящуюся к среде, в которой выполнялись тесты, например версию BenchmarkDotNet, операционную систему, компьютерное оборудование, версию .NET, информацию о компиляторе и информацию, связанную с производительностью приложения.

Несколько файлов также будут созданы в папке BenchmarkDotNet.Artifacts в корневой папке приложения. Вот краткое изложение результатов.

Сводка результатов тестов BenchmarkDotNet
Сводка результатов тестов BenchmarkDotNet

Как видно из сводки, показанной на рисунке, для каждого проверенного метода вы увидите строку данных, которая определяет показатели производительности, такие как среднее время выполнения, коллекции Gen 0, Gen 1, Gen 2 и т. д.

Изучив результаты, вы можете увидеть, что метод ConcatStringUsingGenericList более производительный, чем метод ConcatStringUsingStringBuilder. Вы также можете увидеть , что для метода ConcatStringUsingStringBuilder выделяется больше управляемой памяти.

Еще один вид результатов тестов BenchmarkDotNet.
Еще один вид результатов тестов BenchmarkDotNet.

Теперь добавьте атрибут RankColumn поверх класса MemoryBenchmarkerDemo. Это добавит к выводу дополнительный столбец, показывающий, какой метод был быстрее. Запустите процесс бенчмаркинга еще раз, используя следующую команду.

-10

Когда вы запускаете эту команду, процесс бенчмаркинга запускается и отображает выходные данные после успешного выполнения процесса. На рисунке ниже показаны выходные данные с добавленным RankColumn.

Результаты тестов BenchmarkDotNet, включая атрибут RankColumn.
Результаты тестов BenchmarkDotNet, включая атрибут RankColumn.

BenchmarkDotNet — это хороший инструмент, который предоставляет простой способ принять обоснованное решение о показателях производительности вашего приложения. В BenchmarkDotNet вызов метода, у которого установлен атрибут Benchmark, называется операцией. Итерация — это имя, данное совокупности нескольких операций.