.NET 6 Preview 3 终于发布了!
注:本内容转自dotNET相关技术公号非原创,供大家传播和阅读!前言2021/4/8 .NET 6 Preview 3 发布,这个版本的改进大多来自于底层,一起来看看都有什么新特性和改进吧。1.新增值类型作为字典值时更快的处理方法.NET 6 Preview 3 引入了新的 unsafe API CollectionsMarshal.GetValueRef,这个 API 允许你在无数据拷贝的情况下
注:本内容转自dotNET相关技术公号非原创,供大家传播和阅读!
前言
2021/4/8 .NET 6 Preview 3 发布,这个版本的改进大多来自于底层,一起来看看都有什么新特性和改进吧。
1.新增值类型作为字典值时更快的处理方法
.NET 6 Preview 3 引入了新的 unsafe API CollectionsMarshal.GetValueRef,这个 API 允许你在无数据拷贝的情况下就地更新值,并且将键的哈希计算从 2 次减少到 1 次。该改进在高性能场景下更新字典中存储的 struct 非常有用。
例如:
ref MyStruct value = CollectionsMarshal.GetValueRef(dictionary, key);
// 如果不存在则返回 Unsafe.NullRef()
if (!Unsafe.IsNullRef(ref value))
{
// 无需拷贝,就地更新
value.MyInt++;
}
- 接口检查和转换性能提升
接口的转换以及检查类型是否实现某接口的性能提升了 16~38%,该改进对模式匹配的性能提升尤其有用。
运行时,.NET 6 Preview 3 也包含更多的运行时改进。
3.代码生成优化
检查 Length 后移除边界检查
Span 边界检查省略和顶层范围检查节点移除
添加对字节数组访问的 loop cloning 支持
JIT: 非 void 的 ThrowHelpers
浮点数常量 CSE
为不可变静态只读字段启用 CSE 和循环不变式提升优化
折叠更多的常数字符串 null 检查
消除没有 GC 字段的被跟踪临时内存的零初始化
4. 动态 PGO
更新返回合并和尾调用的 profile
Class profile: 为集合类 typehandle 可使用 unknown 占位符
5. 在寄存器中保持值类型结构
完成值类型结构改进的第一部分: 创建更多的 LCL_FLD
改进 ‘STORE_BLK(lcl_var)’ 的生存性
6.完成 .NET 6 异常处理器写直通
JIT 中默认启用
将单定义的异常处理器放入寄存器
7~18% 性能提升
