BenchMark en computación se conoce como el acto o proceso para evaluar o realizar auditoria sobre diferentes componentes de la aplicación, como por ejemplo métodos y funciones en el concepto de programación orientada a objetos.
BenchmarkDotNet es un proyecto opensource para .net diseñado para este proceso y facilitar cada una de las pruebas que deseemos hacer.
con banchMarkDotnet tenemos las siguientes ventajas
- Rutina estándar de benchmarking: generando un caso aislado en cada proyecto por cada método; auto-selección de la cantidad de iteraciones y calculo de estadísticas.
- Soporte de frameworks: Full .NET Framework (4.6+), .NET Core (1.1+), Mono
- Soporte de lenguajes: C#, F#, and Visual Basic
- Sistemas operativos : Windows, Linux, MacOS
- Fácil comparación de ambientes (
x86
vsx64
,LegacyJit
vsRyuJit
, and so on; see: Jobs) - Reportes: markdown, csv, html, json, xml, plain text and png plots
Toda la documentación del proyecto se encuentra en su pagina oficial http://benchmarkdotnet.org/index.htm
Para usar BenchMarkDotnet solo tenemos que instalar el nuget correspondiente en el proyecto en que estemos y con eso podemos empezar a utilizarlo facilmente
El siguiente código muestra un ejemplo sencillo usando BrenchMark en una aplicación de consola de netcore, como vemos lo único que debemos hacer es usar la marca [Benchmark] sobre el método que queremos auditar y dentro de la aplicación utilizamos BenchmarkRunner.Run(); no tenemos que hacer impresión directamente en consola (osea usar Console.WriteLine), muy importa tener en cuenta que la aplicación debe esta en modo Release
namespace BenchMarkDotnetDemo { class Program { static void Main(string[] args) { var summary = BenchmarkRunner.Run(); Console.ReadLine(); } } public class RandomCustom { int getRandom() { int inRandom = 0; for (int i = 0; i < 10000; i++) { inRandom = new Random().Next(i); } return inRandom; } [Benchmark] public int GetintRandom() => getRandom(); } }
vemos el siguiente resultado en la consola con los datos obtenidos
Dentro del proyecto podemos encontrar también una carpeta llamada BenchmarkDotNet.Artifacts donde se almacenan los resultados
Fácilmente con un Tag dentro de la clase podemos indicar en que frameworks se llevará acabo las pruebas:
[ClrJob, CoreJob, MonoJob] // used to specify the system core (CoreJob), Mono (MonoJob) and dotnet classic (ClrJob)
Usando [AnyCategoriesFilter(“Run”)] podemos filtrar los métodos antes de la ejecución.
Podemos indicar que un atributo será un parámetro y los valores con los que deseamos hacer las pruebas [Params(50, 1000,50000,1000000)]
Muchas otras configuraciones adicionales se pueden hacer y se encuentran dentro de la documentación de BenchmarkDotNet
El siguiente es un ejemplo mas completo usando las opciones antes mencionadas
class Program { static void Main(string[] args) { var summary = BenchmarkRunner.Run<RandomCustom>(); Console.ReadLine(); } } [CoreJob] // used to specify the system core (CoreJob), Mono (MonoJob) and dotnet classic (ClrJob) [AnyCategoriesFilter("Run")] //execute all method with mark NoRun public class RandomCustom { [Params(50, 1000,50000,1000000)] public int intlong { get; set; } int getRandom() { int inRandom = 0; for (int i = 0; i < intlong; i++) { inRandom = new Random().Next(i); } return inRandom; } [Benchmark] [BenchmarkCategory("Run")] public int GetintRandom() => getRandom(); [Benchmark] [BenchmarkCategory("NoRun")] public int GetintRandom2() => (getRandom() *2); }
podemos ver los resultados con cada una de los valores del parámetro
Código Fuente: