Steven Toub 向 .NET 5 引入了〜无分配
ValueTask<T>
。来自他的深刻教育传奇.NET 5 中的性能改进:
Method Runtime Mean Ratio Allocated
ValueTaskCost .NET FW 4.8 1,635.6 us 1.00 294010 B
ValueTaskCost .NET Core 3.1 842.7 us 0.51 120184 B
ValueTaskCost .NET 5.0 812.3 us 0.50 186 B <--- !
我第一次看到这个是在 Dapper 英雄 Marc Gravell here 的一篇文章中,他建议总是使用
ValueTask
而不是 Task
(尽管有趣的是 Dapper 并没有这样做)。
可以通过环境变量
DOTNET_SYSTEM_THREADING_POOLASYNCVALUETASKS
启用该功能,但如今 .NET 中似乎不再存在该变量。
发生什么事了?是否有技术原因将其删除或默认?
[此处](https://github.com/dotnet/runtime/pull/50116)实验性功能被替换为自定义构建器实现,该实现通过添加属性在逐个方法的基础上使用:
[AsyncMethodBuilder(typeof(PoolingAsyncValueTaskMethodBuilder<>))]
(或非通用等效项)