Benchmarks Clients Http
Tags: dotnet, csharp, programming, performance
Published: 2022-07-20 12:35:01

Uma ação que faz parte do dia a dia na vida de um desenvolvedor, é a necessidade de consumir alguma API utilizando chamadas HTTP.

Para tal tarefa temos hoje algumas libs (bibliotecas), que tornam nosso trabalho mais fácil.

Realizei um benchmark com as libs mais populares no universo dotnet:


## [HttpClient:](https://docs.microsoft.com/pt-br/dotnet/api/system.net.http.httpclient?view=net-6.0)
  

É uma classe nativa do dotnet sendo a mais utilizada.

Podemos utilizar o HttpClient para enviar requisições HTTP e receber respostas HTTP baseada em um URI.


## [RestSharp](https://restsharp.dev/):
  

É uma lib http client open-source, utilizada para o consumo de APIs.

Baseado nisso, podemos utiliza-lá instalando-a através do NuGet Package Manager.

RestSharp pode se comunicar com qualquer API usando o protocolo HTTP, seu proposito é o consumo de REST APIs. 


## [Flurl:](https://flurl.dev/)
  

É uma lib http client, seu nome é um trocadilho com Fluent URL.

Ele se descreve como "Um builder de URL moderno, fluente, assíncrono, testável, portável, cheio de buzzords e uma biblioteca com um client HTTP para dotnet”.

De fato a descrição é precisa com o que essa lib entrega.


## [Refit:](https://github.com/reactiveui/refit)
  

O Refit é uma biblioteca para dotnet com o intuito de facilitar o consumo de API's REST.

A ideia é fornecer interfaces que abstraem a comunicação com os serviços HTTP possibilitando a escrita de um código limpo e de baixo acoplamento usando poucas linhas de código.


## Cenário para o benchmark:
  

- Todas as requests foram realizadas para o jsonplaceholder, uma api fake utilizada para testes, mais informações sobre [clique aqui](https://jsonplaceholder.typicode.com/).
  

- Foram executadas 3 rodadas de testes, onde o resultado é o average das três execuções.
  

- Utilizei os verbos: POST, PUT e GET.
  

## Resultados:

![Post em milissegundos](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5mhfflpiwxnzcxiqp775.png)

Quando realizamos um POST com um body, temos o **Refit** com o melhor resultado praticamente empatado com o **Flurl**, já o **RestSharp** obteve a pior performance.

![Post Consumo Memória](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bvugpdp1oai8kpdj1vey.png)
 
 No consumo de memória o **Flurl** fica com o troféu, **HttClient** e **Refit** praticamente empatados, mais um vez o **RestSharp** obteve o pior resultado.

![Put em milissegundos](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zc0vn69sod7skxelsy8x.png)
 
Já quando realizamos um PUT com um body, tivemos uma performance próxima entre todos. **RestSharp** sendo o mais rápido com o **HttpClient** sendo o mais lento.

![Put Consumo Memória](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4t4gxdzacfswpfz6pm15.png)
 
Porém, quando analisamos o consumo de memória a vantagem do **RestSharp** vai por água abaixo, visto que ele tem um consumo de memória extremamente alto comparado com o **Refit** e o **HttpClient** que ficam praticamente empatados em primeiro.

![Get em milissegundos](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/13lojdsg31saduqjkb56.png)
 
Aqui foi realizado um Get sem nenhum filtro ou parâmetro retornando um total de 200 resultados.

Mais uma vez tivemos todos as libs com performance extremamente próxima tendo o **HttpClient** com uma ligeira vantagem.

![Get Consumo Memória](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s5fvcefa49a9y1rxec0n.png)
 
Novamente quanto o assunto é consumo de memória todo o nivelamento no quesito velocidade vai por água abaixo para o **RestSharp**, novamente tendo o pior consumo de memória.

**Refit** mais uma vez mostra um consumo muito baixo de memória, comparado com os demais.

## Conclusão:

Após os testes temos um resultado extremamente positivo para o **Refit**. Apresentando velocidades equivalentes ou até mais rápidas que os demais, fora o quesito consumo de memória onde ele sempre esteve entre os melhores.

O **RestSharp** tem um sério problema no consumo de memória, visto que em todos os testes seu consumo de memória foi discrepante comparado aos outros.

Claro que mais itens devem ser levados em consideração quando formos escolher qual deles utilizar, mas dar uma chance para o **Refit** parece ser uma ótima ideia.

Link do repositório com o projeto utilizado: [clique aqui](https://github.com/ouell/http-clients).