關於.NET 6.0 Crossgen2的一些研究

Eric zhou發表於2022-03-28

NET 6.0引入了Crossgen工具的後續版本Crossgen2,這個工具提供了程式提前(AOT)編譯的能力。

什麼是CrossGen?

我們日常開發時使用C#編譯器CSC編譯一個.NET程式集,程式集包含MSIL程式碼(中間語言程式碼)。當應用程式執行時,目標環境的本地JIT編譯器將MSIL程式碼轉換為本機程式碼,然後CPU才能執行它們。

但是這種JIT編譯到導致應用程式啟動很慢,因為JIT編譯器必須花時間翻譯程式碼。

為了實現更快地啟動應用程式,CoreCLR包含了一個名為CrossGen的工具,它可以將MSIL程式碼預編譯成本機程式碼。

其實最早可以追溯到.NET ngen技術,Ngen.exe (Native Image Generator)

然後,.NET 6設計引入Crossgen2有兩大目標:

  •   提高crossgen開發的效率
  •   並實現crossgen目前無法實現的一系列功能。

這種轉換有點類似於本機程式碼csc.exe升級演進為基於Roslyn的託管程式碼編譯器。這種過程。

Crossgen2是用C#編寫的,但是它沒有像Roslyn那樣公開一個功能全面的API,可以程式設計靈活使用。

接下來簡單瞭解一下關於Crossgen2的幾個主要問題:

一、Crossgen2的用途是什麼,什麼時候應該使用它

Crossgen 是一個為程式碼提供提前 (AOT) 編譯的工具,從而減少了執行時對 JIT的效能消耗。

釋出應用程式時,Crossgen 對所有程式集執行 JIT,並將 JIT 程式碼儲存在一個額外的部分中,該部分可以在執行時快速獲取。

Crossgen 應該用在快速啟動的應用場景中。

二、Crossgen2跨平臺編譯原理是什麼?

Crossgen2支援跨作業系統和體系結構的交叉編譯能力。未來使用一臺構建伺服器就可以為所有目標環境生成本機程式碼Native Code,直接執行,提升第一次訪問的效能和速度。

內部實現上,在Arm64上,Crossgen2可以使用編譯為Arm64的x64 RyuJIT生成x64程式碼。類似的方式還有x64架構下生產x64程式碼。Crossgen2載入為該配置構建的RyuJIT。

三、用 C# 編寫 Crossgen 的主要優點和缺點是什麼

用 C# 編寫,可以訪問一組豐富的 .NET API 以及使用託管語言提供的記憶體安全保證。

使用 C# 的一個缺點是同時在許多小型程式集上使用 Crossgen2 時會增加處理時間,因為多次啟動執行時會產生開銷。幸運的是可以通過在自身上執行 Crossgen2 來緩解大部分問題!

四、Crossgen2的設計過程

Crossgen2 也不是簡單的託管重寫。該架構使用圖表來驅動分析和編譯。這允許掃描器、優化器、分析器處理、分析、表示正在編譯的程式集。這個專案已經進行了 2 年——Crossgen2 編譯器的起源始於 2016 年左右的一個研究專案。

展望未來,crossgen2 將給我們提供更多選擇,為平臺和程式碼做出更高效能的選擇。讓我們持續關注。

 

周國慶

2022/3/28

相關文章