微軟釋出了最新的.NET Core 3.0第6預覽版,更新了能夠加速程式載入速度的ReadyToRun(R2R)格式,以及可以縮減應用程式大小的組譯連結(Assembly Linking)工具IL linker。

.NET Core 3.0讓開發者可以把.NET Core用程式編譯成為R2R格式,以縮短啟動的時間,微軟提到,R2R是一種AOT(Ahead-Of-Time)編譯的形式,其二進位檔案能夠減少JIT在載入應用程式需要的工作量,藉以提高載入的效能。

由於R2R二進位檔案包含了類似JIT所產生的原生碼,因此能夠減少JIT的工作給予執行緩衝空間,不過也因為R2R包含了一些中介語言程式碼,因此產生的檔案相對來說也比較大,是一個啟動效能與檔案大小的取捨。微軟給出了實驗資料,只包含中介語言的應用程式,檔案大小為150MB,記憶體使用量為69.1MB,而啟動時間為1.9秒,但使用ReadyToRun格式的相同應用程式,雖然檔案略大為156MB,但是記憶體使用量只有55.7MB,而且啟動速度只要1.3秒。

不過目前R2R仍有許多限制,R2R現在僅支援自包含(Self-contained)應用程式,在之後的預覽版才會開始支援與框架相依的應用程式。.NET Core 3.0 SDK可以設定排除特定應用程式,以免被編譯成為R2R,微軟提到,部分應用程式不需要最佳化效能,不編譯成R2R反而比較省空間。

.NET Core 3.0開始支持R2R,但R2R並不向後支援,因此較舊的.NET Core版本無法使用,另外,開發者只能編譯函式庫成R2R,以作為應用程式的一部分,目前還不能作為NuGet套件交付,微軟表示,這項功能要依使用者回饋決定是否要支援。而R2R現在也不支援跨平臺編譯,在Windows x64環境只能編譯Windows ARM32、ARM64以及x86映象檔,而在Linux x64只能編譯Linux ARM32和ARM64映像檔。

除了R2R的更新,微軟提到,.NET Core 3.0還提供了一個特別組譯連結工具IL linker,可以透過分析中介語言並刪減用不到的組譯語言,確保自包含應用程式僅包含實際需要的程式碼,而這能夠顯著的降低某些應用程式的大小,微軟提到,通常小型控制臺應用程式可以減少最多,因為這些工具使用較小的框架子集,可以修剪的幅度比較大。微軟的實驗資料顯示,對於最基本helloworld應用程式,可以從原本的68MB減少到大約28MB。

而使用映射或是相關動態功能的應用程式或框架,組譯連結工具的修剪工作通常會失敗,因為IL linker不認識這類動態行為,並且無法決定在Runtime的時候需要使用的框架類型。

IL linker與ReadToRun編譯器可以用在同一個應用程式,微軟表示,正常情況是IL linker會讓應用程式變小,但是ReadyToRun編譯器又為讓應用程式變大,但是效能會大幅提升,開發者可以在各種配置中進行測試,了解這些工具選項產生的影響。


Advertisement

更多 iThome相關內容