Last active
April 23, 2016 02:06
-
-
Save benaadams/e23dabec441a7fdf613557aba4688b33 to your computer and use it in GitHub Desktop.
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 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