本文引见了.NET团队新一代64位的Just-In-Time(JIT)编译器。该编译器由 Andrew Pardoe编写, Andrew Pardoe是公共言语运转时(Common Language Runtime)团队的项目司理。
我们的天下正在向64位盘算行进,虽然64位其实不必定比32位更快、更有效。非常多顺序,比拟64位情况而言,在32位情况下运转的更快——由于各类缘由。.Net的64位JIT编译器就是一个很好的例子。JIT编译器为顺序更快的运转做了大量的任务,但其自身并非一个十分快的顺序。但这一切行将改动:新的、下一代的×64JIT编译器可以将编译速度进步两倍,极大改动你对64位.NET代码的固有印象。
32位×86盘算机仿佛一Start就存在了。这是一个十分优良的盘算机的盘算机架构,可是存在一大缺点:32位指针最多可以寻址4GB内存。64位盘算机和其宽指针在实践使用中则可以寻址无限的内存地址。在64位Windows方才呈现时,内存的价钱还绝对昂贵,因而64位机械初始仅用于Server。如今,64位盘算曾经成为主流,盘算机也普通都设置装备摆设大于4GB的内存。乃至一些智妙手机也曾经转向64位,虽然他们可能仅仅安装了1GB的内存。
.NET64位JIT编译器的最后设计目的是:为长工夫运转的Server顺序编译高效的代码。这有别于.NET×86JIT编译器,×86JIT为疾速编译做了各类优化以便顺序可以疾速启动。当64位首要使用在Server顺序时,消耗工夫去编译高效的代码十分成心义。可是,如今的Server顺序包含一些web使用,这些使用需求可以疾速启动。.NET今朝正在运用的64位JIT编译器编译代码的速度其实不老是足够快,这意味着你需求依靠其他技术,例如NGen或许后台JIT,以便到达疾速启动的目标。
.NET Code Generation团队正在开发新一代的的基于X64架构的编译器,该编译器被定名为RyuJIT。新一代JIT的运转速度可以进步两倍,这意味着RyuJIT编译的使用顺序的启动工夫可以放慢30%(JIT编译器所破费的工夫仅仅是顺序启动工夫的一部分,所以顺序其实不能由于编译速度进步两倍就将启动工夫进步两倍)。与此同时,新一代的JIT依然可以位长工夫运转的Server使用编译高效的代码。
下图比照了相当示例代码下JIT64和RyuJIT的编译速度。每行代表了RyuJIT比JIT64快几多倍,因而数字越大越好。
一切的示例代码在RyuJIT下的编译速度都快于JIT64,你该当留意到第二行——RFC822 e-mail正则表达式。第二行曾经逾越了图表的鸿沟,这是由于正在表达式在JIT64下的功能特别低下。编译该基准测试在JIT64下耗费60秒、最多耗费1.4GB物理内存;运用RyuJIT,仅耗费1.8秒、最多运用199MB物理内存。
Paint.NET是RyuJIT获胜的更具代表性的例子。在测试机械上,他的启动工夫从2.3秒减少到1.8秒。这意味着编译工夫从JIT64的1510ms减少到RyuJIT的970ms。更快的编译速度、更少的内存运用使每一个人的代码运转的更好。
RyuJIT功能的晋升和内存运用的减少十分使人难以相信,但这是却不是RyuJIT最好的部分。在JIT64的研发过程当中,我决议基于C++团队的优化编译器而不是曾经存在的32位×86架构的JIT(×86架构32位版本的JIT实用静态编译的场景)。由于大大多数64位机械都被用作Server,所以比拟编译速度愈加重视编译代码的质量长短常公道的。但这就形成了.NET CodeGen团队必需保护两个代码库。同时向两个代码库增加新特征、修改bug减慢了立异的速度。近年,新加的ARM架构和面向Windows Phone8.0的MDIL使得坚持立异尤其艰苦。
RyuJIT与×86架构下的JIT基于类似的代码库,但仅面向×64架构。由于RyuJIT是一个愈加当代化的编译器,所以在未来它将成为一切JIT编译器的根底:×86、ARM、MDIL和其他一切新呈现的编译器。具有单一的代码库意味着.NET顺序在分歧的架构下愈加一致——换句话说,你可以具有更好的bug-for-bug兼容性。与此同时,具有单一的代码库也意味着可以更快的实行立异和更快的增加新的编译特征。
RyuJIT如今曾经可以以CTP的方法获得,你可以在非生产情况实行测验考试。今朝RyuJIT还不支撑生产情况,但我们十分盼望听到您关于RyuJIT问题、bug、行动异常等任何问题的反应。发送反应和发问到ryujit@microsoft.com。即便你曾经处理了问题或许找到了问题的替换办法,我们依然盼望听到您的反应。
你下载就能够下载RyuJIT installer。RyuJIT仅可以在任务在64位版本的Windows8.1或许Windows Server 2012 R2。与此同时,RyuJIT其实不修正机械上的NGen——我们盼望可以坚持CTP安装的纯真。最初,假如在编写代码的过程当中启动RyuJIT,你会发明Edit&Continue在64位版本中不再继续任务。
安装完成后,有两种办法运转RyuJIT。假如你仅盼望对一个使用顺序启动RyuJIT,设置情况变量:COMPLUS_AltJit=*;假如你盼望对全部机械启用RyuJIT,设置注册表HKLMSOFTWAREMicrosoft.NETFrameworkAltJit为"*"。两种办法都能使64位CLR运用RyuJIT以替换JIT64。这两种办法都是暂时设置——安装RyuJIT不会对机械做任何永世性的改动(除在某个目次中安装RyuJIT)。
请继续存眷本博客以获得关于RyuJIT的更多音讯。RyuJIT会不时提高以便从CTP改变为一个真实的.NET JIT编译器。假如你想研讨RyuJIT研发面前的更多细节,请拜访.NET CodeGen blog。我们会在.NET CodeGen blog实行问题解答和决议计划宣布。下载安装后请记得给我们发邮件哦ryujit@microsoft.com,十分等待你的来信。
本文中的一切译文仅用于进修和交换目标,转载请务必注明文章译者、出处、和本文链接。 2KB翻译任务按照 CC 协议,假如我们的任务有进犯到您的权益,请实时联络我们。2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务