2022年11月份微软推出了带有STS(标准期限支持)的.NET版本7,仅提供18个月的支持。
微软今年推出了STS版本,因为它已经在2019年提到,它将在每年11月左右发布一个新版本的.NET。
但是,考虑到新的官方.NET7功能和更新,它仍然为用户带来了大量变化和.NET7性能改进。今天给大家分享.NET 7与.NET 6之间的几个值得注意的差异如下:
一、On-stack replacement(OSR)
允许在执行过程中更改已执行的代码。我们可以对于长时间正在运行的方法在执行过程中转换到更新的版本。
堆栈替换背后的思想是,方法不仅可以在调用之间进行替换,甚至可以在它执行时进行替换,而它“在堆栈上”。
除了对0级代码进行调用计数检测外,还对循环进行迭代计数检测。当迭代超过某个限制时,JIT编译该方法的新高度优化版本,将所有本地/寄存器状态从当前调用转移到新调用,然后跳转到新方法中的适当位置。
具体可以看这篇链接的详细介绍
https://devblogs.microsoft.com/dotnet/performance_improvements_in_net_7/
二、Regex Improvements(正则改进和提升)
具体可以参考这个链接
https://devblogs.microsoft.com/dotnet/regular-expression-improvements-in-dotnet-7/
三、Simplified LINQ Ordering 简化的LINQ排序
LINQ排序同时支持IQueryable
和 IEnumerable
看一个示例代码
var data = new[] { 2, 1, 3 }; var sorted = data.Order(); var sortedDesc = data.OrderByDescending();
四、Dynamic PGO(profile-guided optimization) Improvements
动态PGO旨在对静态PGO进行一些关键更改。
动态PGO利用了分层编译。JIT使用0级代码来跟踪方法被调用的次数,或者在循环的情况下,跟踪循环执行的次数。它还可以将其用于其他用途。
例如,它可以精确地跟踪哪些具体类型被用作接口分派的目标,然后在第1层中专门化代码以期望最常见的类型。
启用和禁用PGO,性能差异很大。
五、Reflection Improvements(反射性能提升)
MethodBase.Invoke,通过获取一个MethodBase(例如MethodInfo)对象,该对象表示调用方先前查询的某个方法,并使用运行时需要封送至被调用方的任意参数和需要封送回的任意返回值来调用它。
性能提升了一个数量级
反射还涉及对类型、方法、属性等的对象的大量操作,在使用这些API时可能会产生明显的差异。
另外还有一个Activator.CreateInstance,它将AssemblyName的大部分底层支持从本机运行时代码转移到了CoreLib中的托管代码中。这反过来又会影响使用它的任何东西,例如当使用Activator.CreateInstance重载时,这些重载采用需要解析的程序集名称。
官方提供了一个示例代码,来测试这个方法的性能提升
private readonly string _assemblyName = typeof(MyClass).Assembly.FullName; private readonly string _typeName = typeof(MyClass).FullName; public class MyClass { } [Benchmark] public object CreateInstance() => Activator.CreateInstance(_assemblyName, _typeName);
六、Application Trimming Improvements (应用大小修剪)
修剪特定应用程序中不需要的内容,并制作一个较小的应用程序,从而提供较小的.exe。
七、Memory Caching Improvements
内存缓存改进,这是专门针对ASP.NET的,但这是对如何进行内存缓存的改进。
八、Minimal APIs 改进
- 输出缓存
- 速率限制:在您必须手动写入队列之前,现在只需速率限制您自己的应用程序,然后管理您的呼叫速率—您的依赖关系和更好的用户体验
- 以最少的API上载文件
- 在最少的API中改进开放API
- 路由筛选器处理
- 改进的依赖注入
- ASP.NET核心的一些改进,如MVC和Blazor Pages的可空模型
还有其他很多新的特性,比如说支持TAR File创建,Blazor的升级、加解密算法等。
周国庆
2023/1/15