BenchmarkDotnet помогает преобразовать методы в контрольные показатели, отслеживать их производительность и обмениваться экспериментами по воспроизводимым измерению. Это не сложнее, чем писать модульные тесты! Под капюшоном он выполняет много магии, которая гарантирует надежные и точные результаты благодаря статистическому двигателю перфолиза. BenchmarkDotnet защищает вас от популярных ошибок в сравнении с сравнительными темами и предупреждает вас, если что -то не так с вашим контрольным дизайном или полученными измерениями. Результаты представлены в удобной форме, в которой подчеркиваются все важные факты о вашем эксперименте. BenchmarkDotnet уже принят 22000+ проектами GitHub, включая время выполнения .NET, компилятор .NET, производительность .NET и многие другие.
Легко начать писать критерии, ознакомьтесь с следующим примером (версия для копирования-это версия здесь):
[ SimpleJob ( RuntimeMoniker . Net472 , baseline : true ) ]
[ SimpleJob ( RuntimeMoniker . NetCoreApp30 ) ]
[ SimpleJob ( RuntimeMoniker . NativeAot70 ) ]
[ SimpleJob ( RuntimeMoniker . Mono ) ]
[ RPlotExporter ]
public class Md5VsSha256
{
private SHA256 sha256 = SHA256 . Create ( ) ;
private MD5 md5 = MD5 . Create ( ) ;
private byte [ ] data ;
[ Params ( 1000 , 10000 ) ]
public int N ;
[ GlobalSetup ]
public void Setup ( )
{
data = new byte [ N ] ;
new Random ( 42 ) . NextBytes ( data ) ;
}
[ Benchmark ]
public byte [ ] Sha256 ( ) => sha256 . ComputeHash ( data ) ;
[ Benchmark ]
public byte [ ] Md5 ( ) => md5 . ComputeHash ( data ) ;
}BenchmarkDotnet автоматически запускает тесты по всем временным времени, агрегирует измерения и печатает сводную таблицу с наиболее важной информацией:
BenchmarkDotNet=v0.12.0, OS=Windows 10.0.17763.805 (1809/October2018Update/Redstone5)
Intel Core i7-7700K CPU 4.20GHz (Kaby Lake), 1 CPU, 8 logical and 4 physical cores
[ Host ] : .NET Framework 4.7.2 (4.7.3468.0), X64 RyuJIT
Net472 : .NET Framework 4.7.2 (4.7.3468.0), X64 RyuJIT
NetCoreApp30 : .NET Core 3.0.0 (CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), X64 RyuJIT
NativeAot70 : .NET 7.0.0-preview.4.22172.7, X64 NativeAOT
Mono : Mono 6.4.0 (Visual Studio), X64
| Method | Runtime | N | Mean | Error | StdDev | Ratio |
| ------- | -------------- | ------ | -----------: | ----------: | ----------: | ------: |
| Sha256 | .NET 4.7.2 | 1000 | 7.735 us | 0.1913 us | 0.4034 us | 1.00 |
| Sha256 | .NET Core 3.0 | 1000 | 3.989 us | 0.0796 us | 0.0745 us | 0.50 |
| Sha256 | NativeAOT 7.0 | 1000 | 4.091 us | 0.0811 us | 0.1562 us | 0.53 |
| Sha256 | Mono | 1000 | 13.117 us | 0.2485 us | 0.5019 us | 1.70 |
| | | | | | | |
| Md5 | .NET 4.7.2 | 1000 | 2.872 us | 0.0552 us | 0.0737 us | 1.00 |
| Md5 | .NET Core 3.0 | 1000 | 1.848 us | 0.0348 us | 0.0326 us | 0.64 |
| Md5 | NativeAOT 7.0 | 1000 | 1.817 us | 0.0359 us | 0.0427 us | 0.63 |
| Md5 | Mono | 1000 | 3.574 us | 0.0678 us | 0.0753 us | 1.24 |
| | | | | | | |
| Sha256 | .NET 4.7.2 | 10000 | 74.509 us | 1.5787 us | 4.6052 us | 1.00 |
| Sha256 | .NET Core 3.0 | 10000 | 36.049 us | 0.7151 us | 1.0025 us | 0.49 |
| Sha256 | NativeAOT 7.0 | 10000 | 36.253 us | 0.7076 us | 0.7571 us | 0.49 |
| Sha256 | Mono | 10000 | 116.350 us | 2.2555 us | 3.0110 us | 1.58 |
| | | | | | | |
| Md5 | .NET 4.7.2 | 10000 | 17.308 us | 0.3361 us | 0.4250 us | 1.00 |
| Md5 | .NET Core 3.0 | 10000 | 15.726 us | 0.2064 us | 0.1930 us | 0.90 |
| Md5 | NativeAOT 7.0 | 10000 | 15.627 us | 0.2631 us | 0.2461 us | 0.89 |
| Md5 | Mono | 10000 | 30.205 us | 0.5868 us | 0.6522 us | 1.74 |
Измеренные данные могут быть экспортированы в разные форматы (MD, HTML, CSV, XML, JSON и т. Д.), Включая участки:
Поддерживаемое время выполнения: .net 5+, .net Framework 4.6.1+, .net Core 3.1+, Mono, Nativeaot
Поддерживаемые языки: C#, F#, Visual Basic
Поддерживаемая ОС: Windows, Linux, MacOS
Поддерживаемые архитектуры: x86, x64, arm, arm64, wasm и loongarch64
У BenchmarkDotnet есть множество функций, которые необходимы для всесторонних исследований эффективности. Четыре аспекта определяют дизайн этих функций: простота , автоматизация , надежность и дружелюбие .
Вы не должны быть опытным инженером по производительности, если вы хотите написать тесты. Вы можете разработать очень сложные эксперименты по производительности в декларативном стиле, используя простые API.
Например, если вы хотите параметризовать свой эталон, отметьте поле или свойство с [Params(1, 2, 3)] : BenchmarkDotnet будет перечислять все указанные значения и запустить контрольные показатели для каждого случая. Если вы хотите сравнивать тесты друг с другом, отметьте один из тестов как базовый уровень через [Benchmark(Baseline = true)] : BenchmarkDotnet сравнит его со всеми другими тестами. Если вы хотите сравнить производительность в разных средах, используйте задания. Например, вы можете запустить все тесты на .net Core 3.1 и Mono через [SimpleJob(RuntimeMoniker.NetCoreApp31)] и [SimpleJob(RuntimeMoniker.Mono)] .
Если вам не нравятся атрибуты, вы можете вызвать большую часть API с помощью стиля бегства и написать код, как это:
ManualConfig . CreateEmpty ( ) // A configuration for our benchmarks
. AddJob ( Job . Default // Adding first job
. WithRuntime ( ClrRuntime . Net472 ) // .NET Framework 4.7.2
. WithPlatform ( Platform . X64 ) // Run as x64 application
. WithJit ( Jit . LegacyJit ) // Use LegacyJIT instead of the default RyuJIT
. WithGcServer ( true ) // Use Server GC
) . AddJob ( Job . Default // Adding second job
. AsBaseline ( ) // It will be marked as baseline
. WithEnvironmentVariable ( "Key" , "Value" ) // Setting an environment variable
. WithWarmupCount ( 0 ) // Disable warm-up stage
) ;Если вы предпочитаете опыт командной строки, вы можете настроить свои контрольные показатели через консольные аргументы в любом приложении консоли (другие типы приложений не поддерживаются).
Надежные тесты всегда включают в себя много кода шаблона.
Давайте подумаем о том, что вы должны делать в типичном случае. Во -первых, вы должны провести пилотный эксперимент и определить наилучшее количество вызовов методов. Затем вы должны выполнить несколько итераций разминки и обеспечить, чтобы ваш контрольный показатель достиг устойчивого состояния. После этого вы должны выполнить основные итерации и рассчитать некоторую основную статистику. Если вы рассчитываете некоторые значения в своем тесте, вы должны как -то использовать его, чтобы предотвратить устранение мертвого кода. Если вы используете петли, вам следует заботиться о влиянии цикла разворачивания на ваши результаты (что может зависеть от архитектуры процессора). Как только вы получите результаты, вы должны проверить некоторые специальные свойства полученного распределения производительности, таких как мультимодальность или чрезвычайно высокие выбросы. Вы также должны оценить накладные расходы вашей инфраструктуры и вычесть ее из своих результатов. Если вы хотите проверить несколько сред, вы должны выполнить измерения в каждом из них и вручную собирать результаты.
Если вы пишете этот код с нуля, легко допустить ошибку и испортить ваши измерения. Обратите внимание, что это сокращенная версия полного контрольного списка, которой вы должны следовать во время сравнительного анализа: есть много дополнительных скрытых ловушек, которые следует обрабатывать надлежащим образом. К счастью, вы не должны беспокоиться об этом, потому что BenchmarkDotnet будет выполнять эти скучные и трудоемкие вещи для вас.
Кроме того, библиотека может помочь вам с некоторыми передовыми задачами, которые вы можете выполнить во время расследования. Например, BenchmarkDotnet может измерить списки управляемого и нативного трафика памяти и распечатать разборки для ваших тестов.
Многие рукописные показатели производят неправильные цифры, которые приводят к неправильным бизнес-решениям. BenchmarkDotnet защищает вас от большинства испытательных подводных камней и позволяет достичь высокой точности измерения.
Вам не следует беспокоиться о идеальном количестве вызова метода, количестве разминки и фактических итераций: BenchmarkDotnet пытается выбрать лучшие параметры сравнительного анализа и достичь хорошего компромисса между предварительным измерением и общей продолжительностью всех прогонов. Таким образом, вы не должны использовать никаких магических чисел (например, «мы должны выполнить 100 итераций здесь»), библиотека сделает это для вас на основе значений статистических метрик.
BenchmarkDotnet также предотвращает сравнительный анализ нептимизированных сборок, которые были построены с использованием режима отладки, поскольку соответствующие результаты будут ненадежными. Библиотека печатает предупреждение, если у вас есть прикрепленный отладчик, если вы используете гипервизор (Hyperv, VMware, VirtualBox) или если у вас есть какие -либо другие проблемы с текущей средой.
В течение 6+ лет развития мы столкнулись с десятками различных проблем, которые могут испортить ваши измерения. Внутри TeankmarkDotnet есть много эвристики, чеков, хаков и трюков, которые помогают вам повысить надежность результатов.
Анализ данных о производительности-это трудоемкая деятельность, которая требует внимательности, знаний и опыта. BenchmarkDotnet выполняет основную часть этого анализа для вас и представляет результаты в удобной форме.
После экспериментов вы получаете сводную таблицу, которая содержит много полезных данных о выполненных критериях. По умолчанию он включает только самые важные столбцы, но их можно легко настроить. Набор столбцов является адаптивным и зависит от контрольного определения и измеренных значений. Например, если вы отмечаете один из тестов как базовый уровень, вы получите дополнительные столбцы, которые помогут вам сравнить все тесты с базовой линией. По умолчанию он всегда показывает средний столбец, но если мы обнаружили обширную разницу между средним и средним значениями, оба столбца будут представлены.
BenchmarkDotnet пытается найти некоторые необычные свойства ваших распределений производительности и печатает хорошие сообщения об этом. Например, это предупредит вас в случае мультимодального распределения или высоких выбросов. В этом случае вы можете прокрутить результаты и проверить гистограммы в стиле ASCII для каждого распределения или генерировать красивые графики PNG с использованием [RPlotExporter] .
BenchmarkDotnet не перегружает вас данными; Он показывает только важную информацию в зависимости от ваших результатов: он позволяет вам сохранять краткое изложение для примитивных случаев и расширять ее только для сложных случаев. Конечно, вы можете запросить любую дополнительную статистику и визуализацию вручную. Если вы не настраиваете краткое представление, презентация по умолчанию будет максимально удобной для пользователя. :)
BenchmarkDotnet - это не серебряная пуля, которая волшебным образом делает все ваши критерии корректными и анализирует измерения для вас. Даже если вы используете эту библиотеку, вы все равно должны знать, как проектировать сравнительные эксперименты и как сделать правильные выводы на основе необработанных данных. Если вы хотите узнать больше о методологии сравнительного анализа и хорошей практики, рекомендуется прочитать книгу Андрея Акина (лидерство в проекте BendmarkDotnet): «Процентровое сравнение Pro .NET». Используйте это углубленное руководство для правильного проектирования критериев, измерения ключевых показателей производительности приложений .NET и проанализировать результаты. В этой книге представлены десятки тематических исследований, которые помогут вам понять сложные темы сравнения. Вы будете избегать общих ловушек, контролировать точность ваших измерений и улучшить производительность вашего программного обеспечения.
BenchmarkDotnet уже является стабильной полнофункциональной библиотекой, которая позволяет проводить расследование эффективности на профессиональном уровне. И это продолжает развиваться! Мы все время добавляем новые функции, но у нас слишком много новых классных идей. Любая помощь будет оценена. Вы можете разработать новые функции, исправить ошибки, улучшить документацию или сделать другие крутые вещи.
Если вы хотите внести свой вклад, ознакомьтесь с руководством по внесению вкладчиков и проблем с грибами. Если у вас есть новые идеи или вы хотите жаловаться на ошибки, не стесняйтесь создавать новую проблему. Давайте построим лучший инструмент для бенчмаркинга вместе!
Этот проект принял Кодекс поведения, определяемый Заветом участника, чтобы прояснить ожидаемое поведение в нашем сообществе. Для получения дополнительной информации см. Код поведения .NET .NET.
BenchmarkDotnet поддерживается Фондом программного обеспечения с открытым исходным кодом AWS.