禁用Ruby 1.9.x的YARV编译器

时间:2010-07-26 21:46:12

标签: ruby rspec ruby-1.9 yarv

从命令行运行我的规范与ruby 1.9.x与1.8.7之间的应用程序启动时间有非常明显的差异。我的应用程序使用ruby 1.8.7比使用ruby 1.9.1或1.9.2更快地启动。应用程序启动差异大约为18秒。我的应用程序用1.8.7和1.9.2初始化需要大约5秒钟,而1.9.1和1.9.2则需要23秒。

应用程序初始化时间对于生产来说并不是什么大问题,但对于BDD开发来说这是一个非常重要的事情。每当我更改代码并运行我的规范时,我每次迭代都要等待18秒。

我假设这个应用程序初始化时间归因于我的应用程序初始化时YARV编译字节码。

我对YARV减慢应用程序初始化速度是否正确,是否有办法在命令行上禁用YARV。能够在我运行我的规格时禁用YARV会非常好。

3 个答案:

答案 0 :(得分:5)

YARV是纯Ruby编译器。如果你禁用它,就没有任何东西了。

更准确地说:YARV是一个多阶段实现,其中每个阶段都是单模式。它由Ruby-to-YARV编译器和YARV解释器组成。如果删除编译器,您唯一剩下的就是YARV字节码解释器。除非您想以YARV字节码开始编写应用程序,否则该解释器对您没有多大用处。

这与混合模式实现(例如JRuby和IronRuby)形成对比,后者在阶段内实现多种执行模式(特别是编译器和解释器)。如果你在JRuby或IronRuby中关闭编译器,你仍然可以使用一个可用的执行引擎,因为它们都包含一个解释器。事实上,JRuby实际上是作为一个纯粹的解释器开始并稍后添加了编译器,而IronRuby最初是纯粹的编译器,他们添加了一个解释器完全,因为你遇到同样的问题正在看到:编译单元测试只是浪费时间。

现在唯一解释的Ruby 1.9实现是JRuby。当然,您需要处理整个JVM开销。你可以做的最好的事情是尝试以多快的速度启动JRuby(使用http://CI.JRuby.Org/snapshots/的夜间1.6.0.dev版本,因为1.9支持和启动时间在这个时刻正在大量使用)要么像IBM J9那样快速启动面向桌面的JVM,要么尝试使用JRuby的Nailgun支持,这样可以让JVM在后台运行。

你也可以尝试摆脱RubyGems,这通常会占用大量的启动时间,特别是在YARV上。 (使用--disable-gem命令行选项来真正摆脱它。)

答案 1 :(得分:4)

目前无法禁用YARV,因为MRI 1.9 包含虚拟机,而不是解释器。维持这两者对核心团队来说太过分了。

将来可能会有一些方法来缓存YARV生成的字节码(就像Rubinius那样)。目前无法通过Ruby加载此类字节码(请参阅#971),但您可以轻松编写一个C扩展来完成它。

但是,我会说18秒方式太多了,这可能是个错误。我知道ruby-core中有一些线程讨论require的缓慢;也许你在那里找到有趣的东西!

答案 2 :(得分:0)

下一个1.9.2的RC可能会更快,因为它没有预加载$:所有的宝石lib目录。