Wil*_*ang 5 c# asynchronous task valuetask
Task<T>我正在对和进行基准测试ValueTask<T>。源代码如下:
#LINQPad optimize+ // Enable compiler optimizations
void Main()
{
Util.AutoScrollResults = true;
BenchmarkRunner.Run<TaskAndValueTaskComparsion>();
}
[ShortRunJob]
public class TaskAndValueTaskComparsion
{
[Benchmark]
public ValueTask<int> RunValueTaskWithNew()
{
return new ValueTask<int>(1);
}
[Benchmark]
public Task<int> RunTaskFromResult()
{
return Task.FromResult(1);
}
}
Run Code Online (Sandbox Code Playgroud)
对于结果来说,Task<T>比 快得多ValueTask<T>。但为什么?我真的希望ValueTask<T>返回任务对象时会导致更少的分配。
感谢所有评论者。让我们总结一下所有这些有价值的信息。
.NET 运行时中有一个TaskCache.cs,它为各种基本类型的值(例如true(bool)、false(bool)、-1~ 9(int))创建可缓存的任务。Task.FromResult利用这些缓存的任务。
因此,基准测试结果不正确,因为Task.FromResult总是返回任务对象的缓存版本,并且new ValueTask<int>(1)总是返回新值。
有关更多信息,请阅读了解 ValueTask 的原因、内容和时间。
如果你看得懂中文的话,我昨天也写了一篇文章。看这里。