Skip to content

Instantly share code, notes, and snippets.

@gumbarros
Created June 18, 2024 01:40
Show Gist options
  • Save gumbarros/51107469d656602a4bdb9f483e8f91e3 to your computer and use it in GitHub Desktop.
Save gumbarros/51107469d656602a4bdb9f483e8f91e3 to your computer and use it in GitHub Desktop.
ValueTask vs Task
using System.Collections.Frozen;
using BenchmarkDotNet.Running;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Order;
namespace NCalc.Benchmarks;
public class ExampleExpression
{
public Dictionary<string, Func<Task<object>>> TaskDictionary;
public Dictionary<string, Func<ValueTask<object>>> ValueTaskDictionary;
public async Task<object> EvaluateFromTaskDictionary()
{
return await TaskDictionary["SecretOperation"]();
}
public async ValueTask<object> EvaluateFromValueTaskDictionary()
{
return await ValueTaskDictionary["SecretOperation"]();
}
}
[RankColumn]
[CategoriesColumn]
[MemoryDiagnoser]
[Orderer(SummaryOrderPolicy.FastestToSlowest)]
public class EventHandlerVsLambdaBenchmark
{
private ExampleExpression _exampleExpression;
[GlobalSetup]
public void Setup()
{
_exampleExpression = new ExampleExpression();
_exampleExpression.TaskDictionary = new Dictionary<string, Func<Task<object>>>
{
{ "SecretOperation", () =>
{
return Task.FromResult<object>(42);
}
}
};
_exampleExpression.ValueTaskDictionary = new Dictionary<string, Func<ValueTask<object>>>
{
{ "SecretOperation", () =>
{
return new ValueTask<object>(42);
}
}
};
}
[Benchmark]
public async Task<object> EvaluateFromTaskDictionary()
{
return await _exampleExpression.EvaluateFromTaskDictionary();
}
[Benchmark]
public async Task<object> EvaluateFromValueTaskDictionary()
{
return await _exampleExpression.EvaluateFromValueTaskDictionary();
}
}
public class Program
{
public static void Main(string[] args)
{
_ = BenchmarkRunner.Run<EventHandlerVsLambdaBenchmark>();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment