当前位置:首页 » 其他

RyuJIT:下一代的JIT编译器

2013-12-30 16:25 本站整理 浏览(5)
整个世界正在向64位计算转移,即使它并不总是比32位更快或更有效率。当前的.NET JIT编译器就是一个使得64位计算机上有时导致程序速度减慢的的例子。但是,这将会被改变:一个新的,下一代x64的JIT编译器编译代码的速度将加快两倍,它将改变你对64位.NET代码的印象。
回顾64位计算
32位x86计算机的问世好比黑夜中迎来的天明,这是伟大的计算机架构,但它有很大的问题,32位指针只能寻址到4GB的内存。64位计算机拥有一个更宽的指针,几乎可以访问无限量的内存。当64位Windows问世的时候,内存还很昂贵,所以最初64位计算机只用于服务器。现在64位计算已经走向主流,现在计算机经常配置超过4GB的内存,甚至智能手机都转向64位,尽管事实上它们只有1GB的内存。
不同于.NET的x86的JIT,64位JIT最初设计为用于长时间运行的服务器进程产生高效的代码。而32位的JIT则为产生代码的速度优化,以便程序可以启动得更快。花更多时间编译代码对于64位程序主要用于服务器代码的时候是有意义的。但是,“服务器代码”如今包括了Web应用程序,它们必须启动更快。目前.NET的64位JIT中并不总是以最快的速度编译代码,这意味着必须依靠其它技术,比如NGen或后台JIT实现快速程序启动。
RyuJIT横空出世!
什么叫Ryu?它是.NET代码生成团队一直致力于打造的一个全新的、下一代的x64编译器,代号RyuJIT。这个新的JIT比原先的快两倍,这意味着用RyuJIT编译的应用程序启动速度将快30%(JIT编译器中所花的时间只是启动时间的一部分,所以应用程序的整个启动速度不会快两倍。)此外,新的JIT仍然会为长时间运行的服务器进程产生高效的代码。
这张曲线图比较了各种代码例程使用RyuJIT编译事件相较JIT64的比率(“吞吐量”)。每行显示RyuJIT相较JIT64的增长倍数,所以数字更高表示更好。

虽然所有的代码例程使用RyuJIT编译都加快了,但是应该引起注意的是第二行RFC822电子邮件正则表达式。它甚至超出了图表的宽度!这是因为正则表达式(缩写:RegEx)往往在目前的JIT64上表现得特别糟糕。编译这个基准,JIT64需要60秒,消耗峰值达1.4GB的工作集。用RyuJIT,它只需要1.8秒,以及消耗峰值仅199MB的工作集。
Paint.NET是一个RyuJIT赢得比较正常的例子。它在我们的测试环境中的启动时间从2.3秒减少到1.8秒。需要说明的是,其编译时间从JIT64的1510毫秒降低至RyuJIT的970毫秒。更快的编译速度以及使用更少的内存,使得所有的代码都运行得更好。
精彩的还在后面
RyuJIT的性能提升以及减少工作集需要量非常牛逼,但这些还不是RyuJIT最牛逼的地方。开发JIT64时,我们决定让它基于C++团队的优化编译器而不是基于现有的32位x86 JIT,从而为动态编译场景而优化。大多数64位的计算机被用作服务器,所以较之编译器的吞吐量更偏重生成的代码的质量。但是这曾使得.NET CodeGen团队需要同时维护两套代码库,分别为两者添加功能和修复BUG,因为放缓了创新的步伐。在最近几年中,增加ARM架构和Windows Phone 8.0的MDIL的支持越发难以跟上。
RyuJIT基于x86 JIT相同的代码库,虽然它现在只适用于x64。这是一个现代的编译器,将是在未来我们所有的JIT编译器的基础——x86、ARM 、MDIL以及其它以后增加的任何平台。单一的代码库使得.NET程序在不同的架构之间的表现更较为一致,一般可以获得bug对bug的兼容性。而且,单一的代码库也意味着我们可以更快地创新,并为您更快地带来更多的代码生成特性。
RyuJIT CTP下载地址:
http://aka.ms/RyuJIT
注意,只有Windows 8.1 x64和Windows Server 2012 R2支持,不能用于生产环境。
安装完以后只需要在注册表中HKLM\SOFTWARE\Microsoft\.NETFramework\AltJit设置为字符串"*"即可启用。安装RyuJIT不会永久更改你的电脑,你可以随时切换回来。启用RyuJIT会导致Edit and Continue不可用,这个需要注意下。
原文地址:
http://blogs.msdn.com/b/dotnet/archive/2013/09/30/ryujit-the-next-generation-jit-compiler.aspx
更多信息请关注微软CLR和代码生成团队的博客:
http://blogs.msdn.com/b/clrcodegeneration/