禁用Ruby 1.9.x的YARV编译器

Sea*_*ary 0 ruby rspec yarv ruby-1.9

从命令行运行我的规范与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秒钟.

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

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

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

Jör*_*tag 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支持和启动时间都很大正好在这一刻)使用一些非常快速启动面向桌面的JVM(如IBM J9)或尝试JRuby的Nailgun支持,这使得JVM在后台运行.

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