|
[MemoryDiagnoser] |
|
public class Program |
|
{ |
|
static void Main(string[] args) |
|
{ |
|
var summary = BenchmarkRunner.Run<Program>(); |
|
|
|
} |
|
|
|
[Benchmark] |
|
public async Task<int> CountAsync() |
|
{ |
|
var index = 0; |
|
await s_semaphore.WaitAsync().ConfigureAwait(false); |
|
s_counters[index]++; |
|
s_semaphore.Release(); |
|
return s_counters[index]; |
|
} |
|
|
|
[Benchmark] |
|
public async ValueTask<int> CountAsyncValueTask() |
|
{ |
|
var index = 0; |
|
await s_semaphore.WaitAsync().ConfigureAwait(false); |
|
s_counters[index]++; |
|
s_semaphore.Release(); |
|
return s_counters[index]; |
|
} |
|
|
|
[Benchmark] |
|
public ValueTask<int> CountAsyncValueTaskLocalFunction() |
|
{ |
|
var index = 0; |
|
var task = s_semaphore.WaitAsync(); |
|
return task.IsCompleted ? new ValueTask<int>(Remainder()) : |
|
new ValueTask<int>(Awaited()); |
|
|
|
async Task<int> Awaited() |
|
{ |
|
await task.ConfigureAwait(false); |
|
return Remainder(); |
|
} |
|
|
|
int Remainder() |
|
{ |
|
s_counters[index]++; |
|
s_semaphore.Release(); |
|
return s_counters[index]; |
|
} |
|
} |
|
|
|
[Benchmark] |
|
public ValueTask<int> CountAsyncValueTaskLocalFunctionNoCapture() |
|
{ |
|
var index = 0; |
|
var task = s_semaphore.WaitAsync(); |
|
return task.IsCompleted ? new ValueTask<int>(Remainder(index)) : |
|
new ValueTask<int>(Awaited(task, index)); |
|
|
|
async Task<int> Awaited(Task task_, int index_) |
|
{ |
|
await task_.ConfigureAwait(false); |
|
return Remainder(index_); |
|
} |
|
|
|
int Remainder(int index_) |
|
{ |
|
s_counters[index_]++; |
|
s_semaphore.Release(); |
|
return s_counters[index_]; |
|
} |
|
} |
|
|
|
[Benchmark] |
|
public ValueTask<int> CountAsyncValueTaskMultipleFunctions() |
|
{ |
|
var index = 0; |
|
var task = s_semaphore.WaitAsync(); |
|
return task.IsCompleted ? new ValueTask<int>(CountAsyncValueTaskMultipleFunctionsRemainder(index)) : |
|
new ValueTask<int>(CountAsyncValueTaskMultipleFunctionsAwaited(task, index)); |
|
} |
|
|
|
static async Task<int> CountAsyncValueTaskMultipleFunctionsAwaited(Task task, int index) |
|
{ |
|
await task.ConfigureAwait(false); |
|
return CountAsyncValueTaskMultipleFunctionsRemainder(index); |
|
} |
|
|
|
static int CountAsyncValueTaskMultipleFunctionsRemainder(int index) |
|
{ |
|
s_counters[index]++; |
|
s_semaphore.Release(); |
|
return s_counters[index]; |
|
} |
|
|
|
static readonly int[] s_counters = new int[20]; |
|
static readonly SemaphoreSlim s_semaphore = new SemaphoreSlim(20, 20); |
|
} |