-
-
Save BornaGajic/3a7b9ba69ac372cd92ccff85f34d933f to your computer and use it in GitHub Desktop.
ValueTask vs Task benchmark
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using BenchmarkDotNet.Attributes; | |
namespace Sandbox | |
{ | |
[MemoryDiagnoser] | |
[ShortRunJob] | |
public class Benchmarks | |
{ | |
/// <summary> | |
/// 1 in 2 is async, returns Task<int> | |
/// </summary> | |
[Benchmark] | |
public async Task<int> CalculateAsync_1_In_2_Async_Task() | |
{ | |
var retResult = 0; | |
for(int item = 1; item <= 10_000; item++) | |
{ | |
retResult += await GetNextAsync_Task(item, 2); | |
} | |
return retResult; | |
} | |
/// <summary> | |
/// 1 in 100 is async, returns Task<int> | |
/// </summary> | |
[Benchmark] | |
public async Task<int> CalculateAsync_1_In_100_Async_Task() | |
{ | |
var retResult = 0; | |
for (int item = 1; item <= 10_000; item++) | |
{ | |
retResult += await GetNextAsync_Task(item, 100); | |
} | |
return retResult; | |
} | |
private async Task<int> GetNextAsync_Task(int token, int asyncFrequency) | |
{ | |
if (token % asyncFrequency == 0) | |
{ | |
return await GetInt(); | |
} | |
return token; | |
} | |
/// <summary> | |
/// 1 in 2 is async, returns ValueTask<int> | |
/// </summary> | |
[Benchmark] | |
public async Task<int> CalculateAsync_1_In_2_Async_ValueTask() | |
{ | |
var retResult = 0; | |
for(int item = 1; item <= 10_000; item++) | |
{ | |
retResult += await GetNextAsync_ValueTask(item, 2); | |
} | |
return retResult; | |
} | |
/// <summary> | |
/// 1 in 100 is async, returns ValueTask<int> | |
/// </summary> | |
[Benchmark] | |
public async Task<int> CalculateAsync_1_In_100_Async_ValueTask() | |
{ | |
var retResult = 0; | |
for (int item = 1; item <= 10_000; item++) | |
{ | |
retResult += await GetNextAsync_ValueTask(item, 100); | |
} | |
return retResult; | |
} | |
private async ValueTask<int> GetNextAsync_ValueTask(int token, int asyncFrequency) | |
{ | |
if (token % asyncFrequency == 0) | |
{ | |
return await GetInt(); | |
} | |
return token; | |
} | |
private async Task<int> GetInt() | |
{ | |
await Task.Yield(); | |
return Random.Shared.Next(1, 100); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using BenchmarkDotNet.Running; | |
using Sandbox; | |
var summary = BenchmarkRunner.Run<Benchmarks>(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment