首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >禁用Ruby 1.9.x的YARV编译器

禁用Ruby 1.9.x的YARV编译器
EN

Stack Overflow用户
提问于 2010-07-27 05:46:12
回答 3查看 859关注 0票数 0

在使用ruby 1.9.x和1.8.7从命令行运行我的specs时,应用程序启动时间有一个非常明显的差异。我的应用程序在ruby 1.8.7上的启动速度比ruby 1.9.1或1.9.2快得多。应用程序启动的差异大约为18秒。我的应用使用1.8.7初始化大约需要5秒,使用1.9.1和1.9.2初始化需要23秒。

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

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

我的YARV减慢了我的应用程序初始化的速度,我说的对吗?有没有办法在命令行上禁用YARV。这将是非常好的能够禁用YARV只有当我运行我的规格。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-07-27 06:05:51

YARV是一个纯Ruby编译器。如果你禁用它,就什么都不剩了。

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

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

Ruby1.9目前唯一的解释型实现是JRuby。当然,您需要处理整个JVM开销。你能做的最好的事情就是使用一些快速启动的面向桌面的JVM,比如IBM J9,或者试试JRuby的指甲枪支持,它能让JRuby在后台运行,所以你可以试着多快地启动JVM (使用来自http://CI.JRuby.Org/snapshots/的nightly 1.6.0.dev版本,因为1.9支持和启动时间都是在这一刻进行的)。

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

票数 5
EN

Stack Overflow用户

发布于 2010-07-27 06:05:53

目前还没有办法禁用YARV,原因很简单,因为MRI 1.9只包括虚拟机,而不包括解释器。对于核心团队来说,维护两者都是一项太多的工作。

将来可能会有缓存YARV生成的字节码的方法(就像Rubinius一样)。目前还没有办法通过Ruby加载这样的字节码(参见#971),但是你可以很容易地编写一个C扩展来完成它。

然而,我会说18秒太长了,这可能是一个bug。我知道在ruby-core上有一些讨论require缓慢的帖子;也许你会在那里发现一些有趣的东西!

票数 4
EN

Stack Overflow用户

发布于 2010-08-03 06:43:12

下一个RC版本1.9.2可能会更快,因为它不会预加载所有gem lib目录下的$:。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3339235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档