微软释出最新.NET Core 3.0预览版,更新能加速应用程式加载的R2R格式
2019-06-17发表
https://www.ithome.com.tw/news/131288
R2R二进制格式虽然会让程式档案容量比较大,但是却能让执行使用较少的内存量且载
入速度较快
微软释出了最新的.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编译器又为让应用程式变大,但是效能会大幅
提升,开发者可以在各种配置中进行测试,了解这些工具选项产生的影响。