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