为什么 Task<T> 比 ValueTask<T> 更快?

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>返回任务对象时会导致更少的分配。

Wil*_*ang 6

感谢所有评论者。让我们总结一下所有这些有价值的信息。

.NET 运行时中有一个TaskCache.cs,它为各种基本类型的值(例如true(bool)、false(bool)、-1~ 9(int))创建可缓存的任务。Task.FromResult利用这些缓存的任务

因此,基准测试结果不正确,因为Task.FromResult总是返回任务对象的缓存版本,并且new ValueTask<int>(1)总是返回新值。

有关更多信息,请阅读了解 ValueTask 的原因、内容和时间

如果你看得懂中文的话,我昨天也写了一篇文章。看这里