我正在对 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);
}
}
对于结果而言,Task<T>
比 ValueTask<T>
快得多。但是为什么呢?我真的期望在返回任务对象时 ValueTask<T>
会造成更少的分配。
Task.FromResult(1)
被缓存了,而且同一个引用一直从你的方法中返回。 - haim770Task.FromResult<T>()
会缓存某些常用的值,例如true
、false
、0
、1
等等。以下是实现的一些链接:https://github.com/dotnet/runtime/blob/486b4d1a36aef5bbe6a77bb2c3412772e712961e/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs#L5219-L5272 https://github.com/dotnet/runtime/blob/486b4d1a36aef5bbe6a77bb2c3412772e712961e/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/TaskCache.cs#L10 - Martin CostelloValueTask.FromResult
。 - Panagiotis Kanavos65534
作为值。ValueTask <T>
确实快了一点。 新结果在这里:https://user-images.githubusercontent.com/88981/170971437-cb2d33f9-8211-42d8-b619-0433af649c36.png - Will Huang