ValueTaks vs Tasks

Apresentação



No C#, tanto ValueTask quanto Task são tipos usados para lidar com operações assíncronas e concorrentes, mas eles diferem em suas implementações e cenários de uso. Aqui estão as principais diferenças entre eles:

  1. Alocação de Memória:
  1. Cenários de Uso:
  1. Número de Awaiters:
  1. Compatibilidade com APIs Assíncronas:

Geralmente, para escolher entre ValueTask e Task, você deve considerar o cenário específico do seu aplicativo. Se a alocação de memória e a eficiência forem preocupações, ValueTask pode ser uma escolha melhor em cenários de baixa latência. Caso contrário, em operações mais longas ou quando a compatibilidade com bibliotecas existentes for uma prioridade, o uso de Task pode ser mais apropriado.

Resultado dos tests

Utilizando a biblioteca  BenchmarkDotNet podemos comprovar a teoria na práticando, vendo que nos cenários aonde todas as chamdas são asyncrona a Task consegue ser mais performática e no cenários aonde todas as chamadas são sincronas o ValueTask consegue ter praticamente a mesma performace utilizando mesmo memória.

BenchmarkDotNet v0.13.7, Windows 11 (10.0.22621.2215/22H2/2022Update/SunValley2)

Intel Core i7-10750H CPU 2.60GHz, 1 CPU, 12 logical and 6 physical cores

.NET SDK 7.0.400
  [Host]: .NET 7.0.10 (7.0.1023.36312), X64 RyuJIT AVX2
  .NET 7.0: .NET 7.0.10 (7.0.1023.36312), X64 RyuJIT AVX2

Job=.NET 7.0  Runtime=.NET 7.0  
Method sync Mean Error StdDev Rank Gen0 Gen1 Allocated
TaskAsync True 26.56 ns 0.567 ns 1.337 ns 1 0.0178 - 112 B
ValueAsync True 30.58 ns 0.586 ns 0.548 ns 2 0.0063 - 40 B
TaskAsync False 70,778.41 ns 1,403.415 ns 2,898.295 ns 3 1.4648 0.4883 9752 B
ValueAsync False 71,536.87 ns 1,430.240 ns 3,078.743 ns 3 1.4648 0.4883 9680 B

Outliers:

Legends: