Skip to content

Instantly share code, notes, and snippets.

@eiriktsarpalis
Created November 19, 2019 12:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save eiriktsarpalis/385ee853e960592ce292ea35ddff110e to your computer and use it in GitHub Desktop.
Save eiriktsarpalis/385ee853e960592ce292ea35ddff110e to your computer and use it in GitHub Desktop.
Task vs ValueTask performance
using System;
using System.Threading.Tasks;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
namespace ValueTaskBenchmarks
{
// Uses the Ackermann function to measure performance of task and friends
// c.f. https://en.wikipedia.org/wiki/Ackermann_function
[MemoryDiagnoser]
public class Ackermann
{
// Ackermann(3, 3) = 61, total recursive calls = 2432
[Params(1, 2, 3)]
public int n;
[Params(1, 2, 3)]
public int m;
[Benchmark(Baseline = true)]
public int Baseline()
{
return Ackermann(m, n);
int Ackermann(int m, int n) => (m, n) switch
{
(0, _) => n + 1,
(_, 0) => Ackermann(m - 1, 1),
_ => Ackermann(m - 1, Ackermann(m, n - 1)),
};
}
[Benchmark]
public ValueTask<int> ValueTask()
{
return Ackermann(m, n);
async ValueTask<int> Ackermann(int m, int n) => (m, n) switch
{
(0, _) => n + 1,
(_, 0) => await Ackermann(m - 1, 1),
_ => await Ackermann(m - 1, await Ackermann(m, n - 1)),
};
}
[Benchmark]
public Task<int> Task()
{
return Ackermann(m, n);
async Task<int> Ackermann(int m, int n) => (m, n) switch
{
(0, _) => n + 1,
(_, 0) => await Ackermann(m - 1, 1),
_ => await Ackermann(m - 1, await Ackermann(m, n - 1)),
};
}
}
class Program
{
static void Main()
{
BenchmarkRunner.Run<Ackermann>();
}
}
}
BenchmarkDotNet=v0.12.0, OS=Windows 10.0.18363
Intel Core i7-8665U CPU 1.90GHz (Coffee Lake), 1 CPU, 8 logical and 4 physical cores
.NET Core SDK=3.1.100-preview3-014645
  [Host]     : .NET Core 3.1.0 (CoreCLR 4.700.19.53102, CoreFX 4.700.19.55104), X64 RyuJIT
  DefaultJob : .NET Core 3.1.0 (CoreCLR 4.700.19.53102, CoreFX 4.700.19.55104), X64 RyuJIT

Method n m Mean Error StdDev Median Ratio RatioSD Gen 0 Gen 1 Gen 2 Allocated
Baseline 1 1 8.857 ns 0.2074 ns 0.2388 ns 8.866 ns 1.00 0.00 - - - -
ValueTask 1 1 125.333 ns 3.9694 ns 10.6635 ns 121.942 ns 15.05 1.69 - - - -
Task 1 1 63.987 ns 1.3532 ns 1.3897 ns 63.966 ns 7.22 0.23 - - - -
Baseline 1 2 26.763 ns 0.4669 ns 0.4139 ns 26.648 ns 1.00 0.00 - - - -
ValueTask 1 2 476.952 ns 9.3495 ns 8.7456 ns 477.926 ns 17.84 0.35 - - - -
Task 1 2 236.332 ns 4.6040 ns 5.1173 ns 235.215 ns 8.81 0.20 - - - -
Baseline 1 3 189.247 ns 3.7806 ns 7.0076 ns 189.080 ns 1.00 0.00 - - - -
ValueTask 1 3 3,812.292 ns 75.6200 ns 80.9126 ns 3,804.229 ns 19.82 0.86 - - - -
Task 1 3 2,307.302 ns 45.5397 ns 52.4436 ns 2,291.761 ns 12.02 0.61 0.3777 - - 1584 B
Baseline 2 1 11.248 ns 0.2124 ns 0.1986 ns 11.321 ns 1.00 0.00 - - - -
ValueTask 2 1 183.435 ns 1.7635 ns 1.4726 ns 183.324 ns 16.29 0.30 - - - -
Task 2 1 89.209 ns 1.7744 ns 1.6598 ns 89.951 ns 7.93 0.17 - - - -
Baseline 2 2 49.115 ns 0.6867 ns 0.5734 ns 48.889 ns 1.00 0.00 - - - -
ValueTask 2 2 904.934 ns 17.1505 ns 17.6123 ns 907.298 ns 18.48 0.49 - - - -
Task 2 2 491.162 ns 9.7270 ns 10.4077 ns 493.575 ns 10.02 0.21 - - - -
Baseline 2 3 1,238.368 ns 24.3141 ns 32.4586 ns 1,229.467 ns 1.00 0.00 - - - -
ValueTask 2 3 20,072.025 ns 393.1447 ns 551.1340 ns 20,180.771 ns 16.22 0.71 - - - -
Task 2 3 13,368.605 ns 264.7312 ns 247.6297 ns 13,256.192 ns 10.78 0.34 4.7455 - - 19872 B
Baseline 3 1 14.554 ns 0.2493 ns 0.2332 ns 14.621 ns 1.00 0.00 - - - -
ValueTask 3 1 254.058 ns 5.0642 ns 7.8843 ns 255.125 ns 17.80 0.58 - - - -
Task 3 1 127.259 ns 2.4915 ns 3.0598 ns 128.881 ns 8.69 0.23 - - - -
Baseline 3 2 77.015 ns 0.9136 ns 0.8099 ns 76.799 ns 1.00 0.00 - - - -
ValueTask 3 2 1,510.296 ns 28.8578 ns 28.3422 ns 1,521.415 ns 19.59 0.45 - - - -
Task 3 2 860.356 ns 16.3538 ns 16.0616 ns 862.778 ns 11.19 0.26 0.0515 - - 216 B
Baseline 3 3 7,396.098 ns 145.2481 ns 155.4139 ns 7,453.833 ns 1.00 0.00 - - - -
ValueTask 3 3 92,352.103 ns 1,839.9734 ns 1,721.1122 ns 92,585.132 ns 12.50 0.40 - - - -
Task 3 3 65,442.848 ns 1,305.4800 ns 1,503.3927 ns 65,409.296 ns 8.84 0.27 30.2734 - - 126864 B
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment