我正在Task和ValueTask上做一个基准测试。源代码如下:
#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>会导致更少的分配。
发布于 2022-05-31 03:47:54
谢谢所有的评论者。让我们总结一下所有这些有价值的信息。
TaskCache.cs在.NET运行时中为各种原始类型的值创建了一个可缓存的任务,例如true(bool)、false(bool)、-1 ~ 9(int)。Task.FromResult利用这些缓存的任务。
因此,基准测试结果是不正确的,因为Task.FromResult总是返回任务对象的缓存版本,而new ValueTask<int>(1)总是返回一个新值。
有关更多信息,请阅读理解ValueTask的Whys,Whats和Whens。
如果你能读中文,我昨天也写了一篇文章。见这里。
https://stackoverflow.com/questions/72432233
复制相似问题