首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Task<T>比ValueTask<T>快?

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

Stack Overflow用户
提问于 2022-05-30 09:43:39
回答 1查看 470关注 0票数 4

我正在TaskValueTask上做一个基准测试。源代码如下:

代码语言:javascript
复制
#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>会导致更少的分配。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

如果你能读中文,我昨天也写了一篇文章。见这里

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72432233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档