0

使用 ruby​​ 1.9.x 与 1.8.7 从命令行运行我的规范之间的应用程序启动时间存在非常明显的差异。我的应用程序使用 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 会非常好。

4

3 回答 3

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命令行选项真正摆脱它。)

于 2010-07-26T22:05:50.973 回答
4

目前没有办法禁用 YARV,因为 MRI 1.9包括虚拟机,而不包括解释器。对于核心团队来说,同时维护两者将是太多的工作。

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

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

于 2010-07-26T22:05:52.560 回答
0

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

于 2010-08-02T22:43:12.410 回答