全新Ruby 2.6版本发布!JIT技术引领潮流,但可能影响Rails性能

发表时间: 2018-12-28 16:08

程序语言Ruby团队在圣诞节的当天,发布了Ruby 2.6正式版,推出了主打的功能JIT(Just-In-Time)编译器,而这是Ruby团队历经一年的努力结晶。

JIT允许像是Ruby这样的直译语言,最佳化频繁执行的方法(Method),以便在未来呼叫时,可以运作的更加快速。虽然实作方法在每个语言中都不相同,但一般来说,JIT的目标是跳过方法部分或是全部的直译步骤。

由于Ruby之父松本行弘为团队设定了一个目标,希望Ruby 3的应用程式执行速度可以是现在Ruby的3倍,这个计画被称为Ruby 3x3。在这个目标设定之后,Ruby已经在诸多地方改善性能,但仍然远远不够,而将JIT加入Ruby则是一个最可能达成目标的做法。

从11月RubyConf的演讲中,发布的资料显示,Ruby使用新的—jit选项,在热门的optcarrot基准测试中的表现,Ruby 2.6与Ruby 2.5相比,执行效率的确获得大幅提升打1.8倍。不过,JIT目前看来似乎是一个双面刃,因为他也造成其他替代基准测试,例如Rails与Sidekiq的性能下降。

Heroku开发者推广工程师Jonan Scheffler表示,由于Rails具有大量频繁呼叫的方法,在使用MJIT(Method-based JIT)时将会遭遇性能降低的情况,因为最佳化单一方法的过程,比实际直译该方法还要慢,而理想情况,这种性能降低的情况,将会因呼叫经过编译的方法渐增的性能吸收,但对于大量方法来说,这种性能降低的影响太过巨大。

由于这些编译都是在首次呼叫时发生,所以理论上一旦应用程式经预热之后,执行速度应该要提升,但是这些方法每一个最初都需要消耗大约2MB的內存,因此编译数千种方法所需要的內存,很快就会接近大多数电脑的配备上限。

而为了解决大量方法造成的性能低落,JIT压缩将会是可行的方法,当编译方法数量接近1,000个,MJIT将在內存中组合这些方法,以缩减他们的大小,这样将有助于改善现在遭遇的问题,不过,这仍然不足以让Rails变得够快。

尽管如此,官方仍然预计将删除—jit选项,在Ruby 2.7预设启用MJIT,尽管在这之前Rails使用MJIT的性能,还不太可能提升至与当前相当。