BenchmarkDotNet librería opensource para benchmarking en .Net

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 vs x64LegacyJit vs RyuJit, 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

Benchmark1

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

Benchmark2

Dentro del proyecto podemos encontrar también una carpeta llamada BenchmarkDotNet.Artifacts donde se almacenan los resultados

 

Benchmark3

 

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

Benchmark4

 

Código Fuente:

https://github.com/Mteheran/BenchMarkDemo