Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@benaadams
Last active April 23, 2016 02:06
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 benaadams/e23dabec441a7fdf613557aba4688b33 to your computer and use it in GitHub Desktop.
Save benaadams/e23dabec441a7fdf613557aba4688b33 to your computer and use it in GitHub Desktop.
using System;
using System.Diagnostics;
using System.Threading.Tasks;
class C
{
static void Main()
{
MainAsync().GetAwaiter().GetResult();
}
static async Task MainAsync()
{
const int iters = 100000000;
// Warmup
int sum = await Warmup();
var sw = Stopwatch.StartNew();
sw.Restart();
for (var i = 0; i < iters; i++)
{
sum += await g(0);
}
sw.Stop();
Console.WriteLine($"ValueTask Await Async {sw.Elapsed.TotalMilliseconds}ms");
sw.Restart();
for (var i = 0; i < iters; i++)
{
var v = g(0);
if (v.IsCompletedSuccessfully)
{
sum += v.Result;
}
else
{
sum += await v;
}
}
sw.Stop();
Console.WriteLine($"ValueTask No-Await Async {sw.Elapsed.TotalMilliseconds}ms");
sw.Restart();
for (var i = 0; i < iters; i++)
{
sum += await g1(0);
}
sw.Stop();
Console.WriteLine($"ValueTask Await No-Async {sw.Elapsed.TotalMilliseconds}ms");
sw.Restart();
for (var i = 0; i < iters; i++)
{
var v = g1(0);
if (v.IsCompletedSuccessfully)
{
sum += v.Result;
}
else
{
sum += await v;
}
}
sw.Stop();
Console.WriteLine($"ValueTask No-Await No-Async {sw.Elapsed.TotalMilliseconds}ms");
sw.Restart();
for (var i = 0; i < iters; i++)
{
sum += await t(0);
}
sw.Stop();
Console.WriteLine($" Task Await Async {sw.Elapsed.TotalMilliseconds}ms");
}
private static async Task<int> Warmup()
{
var sum = 0;
for (var i = 0; i < 10; i++)
{
sum += await g(0);
var v = g(0);
if (v.IsCompletedSuccessfully)
{
sum += v.Result;
}
else
{
sum += await v;
}
sum += await g1(0);
v = g1(0);
if (v.IsCompletedSuccessfully)
{
sum += v.Result;
}
else
{
sum += await v;
}
sum += await t(0);
}
return sum;
}
static async ValueTask<int> g(int delay)
{
if (delay > 0)
{
await Task.Delay(delay);
}
return delay;
}
static ValueTask<int> g1(int delay)
{
if (delay > 0)
{
return t(delay);
}
return delay;
}
static async Task<int> t(int delay)
{
if (delay > 0)
{
await Task.Delay(delay);
}
return delay;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment