.NET

28 fev, 2018

Teste de performance de aplicações .NET Core com BenchMarkDotNet

Publicidade

Ao dedicar tempo pesquisando referências para um outro artigo, me deparei sem querer com algo extremamente novo para mim: o BenckmarkDotNet.

Eu já havia testado ao longo dos anos diversas ferramentas para verificação de performance e achei esta particularmente interessante por permitir que trechos de código sejam comparados quanto à performance, de forma extremamente simples, caso tenhamos dúvidas de qual forma de implementação é mais vantajosa em relação à utilização de recursos computacionais, rapidez e outros aspectos que se considerem relevantes. Isso permite melhores refatorações baseadas em métricas confiáveis.

O framework (se é que podemos assim denominá-lo) é uma iniciativa open-source da comunidade e já possui mais de 2.600 estrelas no GitHub.

Exemplo prático

Para fins de demonstração prática, vamos criar uma aplicação simples do tipo Console Application no Visual Studio 2017:

Em seguida, vamos adicionar ao projeto uma classe simples na linguagem de programação C# para realização de operações matemáticas, contendo um método simples que calcula um determinado número por ele mesmo, apenas para fins de exemplo:

 public class FuncoesMatematicas {
 [Params(1000)]
 public double Number {
  get;
  set;
 }

 public double NumeroAoQuadrado() {
  return this.Number * this.Number;
 }
}

Observação: por questões de simplificação para este exemplo, criei a classe no próprio arquivo Program.cs do projeto.

Há outras formas de implementar o método NumeroAoQuadrado() como, por exemplo, utilizando Math.Pow().

Sendo assim, vamos comparar a performance implementando o mesmo método das duas formas: multiplicando-se manualmente o número por ele mesmo e utilizando Math.Pow, e analisaremos os resultados.

Para conseguirmos utilizar a biblioteca BenckmarkDotNet, basta instalar o pacote correspondente via Nuget:

Após concluída a instalação é necessário referenciar a sua utilização nas diretivas, conforme código-fonte abaixo:

using System;
using System.Security.Cryptography;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;

namespace ExemploBenchMarkDotNet {
 public class FuncoesMatematicas {

  public double Number {
   get;
   set;
  }

  public double NumeroAoQuadrado() {
   return Math.Pow(this.Number, this.Number);
  }
 }

 public class Program {
  public static void Main(string[] args) {

  }
 }
}

Para compararmos as duas formas de implementação, vamos criar um segundo método chamado NumeroAoQuadradoMathPow. Para os métodos que desejamos monitorar a performance, é necessário colocar a anotação “benchmark”, conforme o código abaixo. Também vamos atribuir um valor 1000 para a propriedade Number, para fins de teste.

using System;
using System.Security.Cryptography;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;

namespace ExemploBenchMarkDotNet {


 public class FuncoesMatematicas {
  [Params(1000)]
  public double Number {
   get;
   set;
  }

  [Benchmark]
  public double NumeroAoQuadrado() {
   return this.Number * this.Number;
  }

  [Benchmark]
  public double NumeroAoQuadradoMathPow() {
   return Math.Pow(this.Number, 2);
  }
 }

 public class Program {
  public static void Main(string[] args) {

  }
 }
}

E então, temos o tão esperado teste de performance. Basta rodar a aplicação e aguardar o término da análise. Eis o resultado:

Como pode ser visto na imagem, o método com a implementação Math.Pow apresentou desempenho ligeiramente inferior à primeira implementação. Para sistemas mais complexos e críticos, que exigem altíssimo desempenho, a análise aprofundada método a método pode representar uma abordagem interessante e as métricas dão um resultado imparcial e baseado em fatos, evitando distorções ou falhas humanas no processo.

Além da exibição das métricas em Console, é possível carregar as informações de forma gráfica, mas cabe a demonstração de outros recursos mais avançados em outro artigo, pois este tem apenas carácter introdutório.

Como estamos todos sempre em fase de constante aprendizado, sugestões de melhoria no artigo ou contribuições são sempre muito bem-vindos.

Obrigado por ter lido este artigo até o final. Até mais!

Referências