BenchmarkDotnet le ayuda a transformar los métodos en puntos de referencia, rastrear su rendimiento y compartir experimentos de medición reproducibles. ¡No es más difícil que escribir pruebas unitarias! Bajo el capó, realiza mucha magia que garantiza resultados confiables y precisos gracias al motor estadístico perfolizador. BenchmarkDotnet lo protege de los populares errores de evaluación comparativa y le advierte si algo está mal con su diseño de referencia u obtenida medidas. Los resultados se presentan en una forma fácil de usar que resalta todos los hechos importantes sobre su experimento. BenchmarkDotnet ya es adoptado por más de 22000 proyectos de GitHub, incluidos .NET Runtime, .NET Compiler, .NET Performance y muchos otros.
Es fácil comenzar a escribir puntos de referencia, consulte el siguiente ejemplo (la versión Copy-Pastable está aquí):
[ 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 ejecuta automáticamente los puntos de referencia en todos los tiempos de ejecución, agrega las medidas e imprime una tabla de resumen con la información más importante:
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 |
Los datos medidos se pueden exportar a diferentes formatos (MD, HTML, CSV, XML, JSON, etc.) incluyendo gráficos:
Los tiempos de ejecución compatibles: .NET 5+, .NET Framework 4.6.1+, .NET Core 3.1+, Mono, Nativeaot
Idiomas compatibles: C#, F#, Visual Basic
SO compatible: Windows, Linux, MacOS
Arquitecturas compatibles: x86, x64, brazo, brazo64, wasm y loongarch64
BenchmarkDotnet tiene toneladas de características que son esenciales en investigaciones integrales de rendimiento. Cuatro aspectos definen el diseño de estas características: simplicidad , automatización , confiabilidad y amabilidad .
No debería tener que ser un ingeniero de rendimiento experimentado si desea escribir puntos de referencia. Puede diseñar experimentos de rendimiento muy complicados en el estilo declarativo utilizando API simples.
Por ejemplo, si desea parametrizar su punto de referencia, marque un campo o una propiedad con [Params(1, 2, 3)] : BenchmarkDotnet enumerará todos los valores especificados y ejecutará puntos de referencia para cada caso. Si desea comparar puntos de referencia entre sí, marque uno de los puntos de referencia como la línea de base a través de [Benchmark(Baseline = true)] : BenchmarkDotnet lo comparará con todos los demás puntos de referencia. Si desea comparar el rendimiento en diferentes entornos, use trabajos. Por ejemplo, puede ejecutar todos los puntos de referencia en .NET Core 3.1 y Mono a través de [SimpleJob(RuntimeMoniker.NetCoreApp31)] y [SimpleJob(RuntimeMoniker.Mono)] .
Si no le gustan los atributos, puede llamar a la mayoría de las API a través del estilo fluido y escribir código como este:
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
) ;Si prefiere la experiencia de la línea de comandos, puede configurar sus puntos de referencia a través de los argumentos de la consola en cualquier aplicación de consola (no son compatibles con otros tipos de aplicaciones).
Los puntos de referencia confiables siempre incluyen mucho código de calderas.
Pensemos en lo que debe hacer en un caso típico. Primero, debe realizar un experimento piloto y determinar el mejor número de invocaciones de métodos. A continuación, debe ejecutar varias iteraciones de calentamiento y asegurarse de que su punto de referencia alcance un estado estable. Después de eso, debe ejecutar las principales iteraciones y calcular algunas estadísticas básicas. Si calcula algunos valores en su punto de referencia, debe usarlo de alguna manera para evitar la eliminación del código muerto. Si usa bucles, debe preocuparse por el efecto del desenrollado de bucle de sus resultados (que pueden depender de la arquitectura del procesador). Una vez que obtenga resultados, debe verificar algunas propiedades especiales de la distribución de rendimiento obtenida como multimodalidad o valores atípicos extremadamente altos. También debe evaluar la sobrecarga de su infraestructura y deducirla de sus resultados. Si desea probar varios entornos, debe realizar las mediciones en cada uno de ellos y agregar manualmente los resultados.
Si escribe este código desde cero, es fácil cometer un error y estropear sus medidas. Tenga en cuenta que es una versión abreviada de la lista de verificación completa que debe seguir durante la evaluación comparativa: hay muchas dificultades ocultas adicionales que deben manejarse adecuadamente. Afortunadamente, no debes preocuparte por eso porque BenchmarkDotnet realizará estas cosas aburridas y que llevan mucho tiempo para ti.
Además, la biblioteca puede ayudarlo con algunas tareas avanzadas que puede realizar durante la investigación. Por ejemplo, BenchmarkDotnet puede medir el tráfico de memoria administrado y nativo e imprimir listados de desmontaje para sus puntos de referencia.
Muchos puntos de referencia escritos a mano producen números incorrectos que conducen a decisiones comerciales incorrectas. BenchmarkDotnet lo protege de la mayoría de las trampas de evaluación comparativa y permite lograr una alta precisión de medición.
No debe preocuparse por el número perfecto de invocación de métodos, el número de calentamiento y iteraciones reales: BenchmarkDotnet intenta elegir los mejores parámetros de evaluación comparativa y lograr una buena compensación entre la previsión de medición y la duración total de todas las ejecuciones de referencia. Por lo tanto, no debe usar ningún número mágico (como "Deberíamos realizar 100 iteraciones aquí"), la biblioteca lo hará por usted en función de los valores de las métricas estadísticas.
BenchmarkDotnet también evita la evaluación comparativa de ensamblajes no optimizados que se construyeron usando el modo de depuración porque los resultados correspondientes no serán confiables. La biblioteca imprimirá una advertencia si tiene un depurador adjunto, si usa un Hypervisor (Hyperv, VMware, VirtualBox), o si tiene otros problemas con el entorno actual.
Durante más de 6 años de desarrollo, enfrentamos docenas de problemas diferentes que pueden estropear sus medidas. Dentro de BenchmarkDotnet, hay muchas heurísticas, cheques, hacks y trucos que lo ayudan a aumentar la confiabilidad de los resultados.
El análisis de los datos de rendimiento es una actividad que requiere mucho tiempo que requiere atención, conocimiento y experiencia. BenchmarkDotnet realiza la parte principal de este análisis para usted y presenta resultados en una forma fácil de usar.
Después de los experimentos, obtiene una tabla de resumen que contiene muchos datos útiles sobre los puntos de referencia ejecutados. Por defecto, incluye solo las columnas más importantes, pero se pueden personalizar fácilmente. El conjunto de columnas es adaptativo y depende de la definición de referencia y los valores medidos. Por ejemplo, si marca uno de los puntos de referencia como línea de base, obtendrá columnas adicionales que lo ayudarán a comparar todos los puntos de referencia con la línea de base. Por defecto, siempre muestra la columna media, pero si detectamos una gran diferencia entre la media y los valores medios, ambas columnas se presentarán.
BenchmarkDotnet intenta encontrar algunas propiedades inusuales de sus distribuciones de rendimiento e imprime buenos mensajes al respecto. Por ejemplo, le advertirá en caso de distribución multimodal o valores atípicos altos. En este caso, puede desplazar los resultados y ver los histogramas de estilo ASCII para cada distribución o generar hermosas gráficas de PNG usando [RPlotExporter] .
BenchmarkDotnet no lo sobrecarga con datos; Muestra solo la información esencial dependiendo de sus resultados: le permite mantener el resumen pequeño para casos primitivos y extenderla solo para casos complicados. Por supuesto, puede solicitar cualquier estadística y visualización adicionales manualmente. Si no personaliza la vista de resumen, la presentación predeterminada será lo más fácil de usar posible. :)
BenchmarkDotnet no es una bala de plata que mágicamente hace que todos sus puntos de referencia corrijan y analice las mediciones para usted. Incluso si usa esta biblioteca, aún debe saber cómo diseñar experimentos de referencia y cómo hacer conclusiones correctas basadas en los datos sin procesar. Si desea saber más sobre la metodología de la evaluación comparativa y las buenas prácticas, se recomienda leer un libro de Andrey Akinshin (el líder del proyecto BenchmarkDotnet): "Benchmarking Pro .NET". Use esta guía en profundidad para diseñar correctamente los puntos de referencia, medir las métricas clave de rendimiento de las aplicaciones .NET y analizar los resultados. Este libro presenta docenas de estudios de casos para ayudarlo a comprender temas complicados de evaluación comparativa. Evitará las dificultades comunes, controlará la precisión de sus medidas y mejorará el rendimiento de su software.
BenchmarkDotnet ya es una biblioteca estable con todas las funciones que permite realizar una investigación de rendimiento a nivel profesional. ¡Y continúa evolucionando! Agregamos nuevas características todo el tiempo, pero tenemos demasiadas ideas geniales nuevas. Cualquier ayuda será apreciada. Puede desarrollar nuevas características, corregir errores, mejorar la documentación o hacer otras cosas interesantes.
Si desea contribuir, consulte la guía contribuyente y los problemas de ascenso. Si tiene nuevas ideas o desea quejarse de los errores, no dude en crear un nuevo problema. ¡Construyamos la mejor herramienta para la evaluación comparativa juntos!
Este proyecto ha adoptado el Código de Conducta definido por el Pacto de contribuyente para aclarar el comportamiento esperado en nuestra comunidad. Para obtener más información, consulte el Código de Conducta de la Fundación .NET.
BenchmarkDotnet es compatible con el Fondo de Software de código abierto de AWS.