如何提高 jRuby 的加载速度?

7

相比我的朋友的机器,我在jRuby上执行脚本,特别是运行rake任务或测试时需要等待很长时间。我尝试过jRuby 1.3.1和1.4.1版本,有无ruby-debug gem,但每个配置都出现了同样的问题。

问题很简单: 有没有办法改善jRuby的加载过程? 还是我的jvm配置或jRuby安装出了问题(我使用rvm - ruby version manager来使用jRuby)?


JRuby的大O时间要求是否像vanilla YARV一样糟糕? - Andrew Grimm
4个回答

14

你可以尝试以下几个方法:

  • 使用最新版本的JRuby(由于广泛的测试,即使是最新的git主分支通常也很稳定),他们正在不断地改进启动时间。
  • 明智选择JVM,例如Oracle JRockit针对服务器进行了优化,因此启动性能并不重要(这些应用程序每隔几年才重新启动一次),Sun在过去的十年中主要忽视了桌面,但自1.6u12以来一直在不断提升,最近发布了1.6u18和1.7版本,IBM的J9据说也很轻量级。
  • 尝试使用nailgun,这是一个将JVM作为守护进程在后台运行的项目(JRuby中内置了支持,尝试使用jruby --ng命令运行您的脚本)。
  • 不要只使用JRuby进行单元测试和rake任务:例如ThoughtWorks Mingle团队使用MRI进行单元测试、rake任务和开发,使用JRuby进行集成测试、回归测试和生产环境。 (如果您的rake任务和测试中不使用任何Java库,则此方法显然可行。)

然而,对于JRuby来说,测试和脚本确实是最坏的情况。 JRuby运行时本身已经相当沉重,比MRI要重得多。仅仅将整个程序从磁盘加载到内存中的时间就可能比在MRI中运行相同的脚本要长。我们甚至还没有加上JVM的启动时间!


4

同时,确保您在运行JVM时使用的是客户端模式(假设您正在使用Sun的JVM),因为该模式提供更快的启动速度和更好的性能,适用于测试套件等方面。默认情况下,JRuby应该使用客户端模式的JVM,但这取决于系统和JVM设置等因素。要验证您是否正在使用客户端JVM,请调用jruby -v命令,您应该看到类似以下内容:

Java HotSpot(TM) *Client* VM 1.6.0_18

更新: 请查看Charles的博客文章,其中包含改善启动时间的技巧:http://blog.headius.com/2010/03/jruby-startup-time-tips.html


好的观点,但现在不再适用了,因为自JDK 1.6以来,在所有64位JDK上都忽略了“-client”选项。然而,它的近似等效物是:“-XX:+ TieredCompilation -XX:TieredStopAtLevel = 1”。 - G. Demecki

1

如果你想要改进单元测试的时间,spork可能会有所帮助。


1
JRuby现在有一个--dev标志,可以将多个快速选项组合在一起。我在Rails 5和JRuby 9.1.7.0上运行了我的模型测试,性能提升了80%以上!
$ time rspec spec/models
Finished in 2.85 seconds (files took 10.63 seconds to load)
86 examples, 0 failures

rspec spec/models  57.79s user 1.14s system 288% cpu 20.425 total


$ time JRUBY_OPTS=--dev rspec spec/models
Finished in 1.4 seconds (files took 4.15 seconds to load)
86 examples, 0 failures

JRUBY_OPTS=--dev rspec spec/models  11.51s user 0.48s system 139% cpu 8.600 total

不想打这么多字?创建一个 Makefile!你可以添加 -G 来包含 bundle exec
# Makefile
tests:
    JRUBY_OPTS='--dev -G' rspec

然后只需运行。
$ make tests

来源:https://github.com/jruby/jruby/wiki/Improving-startup-time


起始时间优化

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接