哪个更快:MRI Ruby或JRuby?

时间:2011-02-04 07:49:08

标签: ruby-on-rails ruby performance jruby

如果我使用Ruby on Rails,我应该安装MRI / YARV Ruby还是JRuby?哪个更快?

6 个答案:

答案 0 :(得分:22)

答案取决于许多变数。

但总的来说,Ruby 1.9比JRuby快,但Ruby 1.8比JRuby慢。

e.g。根据{{​​3}}:

此外,如果您的应用程序是多线程的,Ruby 1.8 vs JRuby
(a.k.a.MRI)],取决于您拥有多少核心。

答案 1 :(得分:22)

最近的基准测试使JRuby处于领先地位,其次是MagLev,Rubinius,然后是MRI。

基准测试很棘手。 Ruby Benchmark Suite是最常用于Ruby的基准测试。如果删除任何实现失败的基准测试,则会得到以下图表。

RBS

注意我使用了几何平均值。这是平均性能的更好指标,因为它可以规范异常值和机器规格。

您可以运行的最佳基准将特定于您的应用。如果你正在寻找整体性能,你可能想要使用真正的线程,所以Rubinius或JRuby是你唯一真正的选择。

此外,每个实现在不同的事情上都很快。 MRI在启动时非常非常,所以它对脚本很有用。对于运行时间较长的应用程序(如Web应用程序),Rubinius或JRuby通常比MRI更好。

答案 2 :(得分:2)

老实说,这取决于你的代码。在你的机器上安装RVM或Pik,安装一堆不同版本的ruby,然后尝试在其中运行你的代码。

例如:频繁重启的应用程序不是JRuby的理想选择,因为JRuby在Hotspot能够有效优化代码之前有一些加速时间。同样,依赖于线程的应用程序不是Ruby 1.8.7的理想选择,因为Ruby 1.8.X不能在处理器上使用多于​​1个内核,因此无法一次在多个线程上执行。

答案 3 :(得分:2)

这些人在programmingzen.com上做了一篇非常好的文章,比较了很多不同风格的红宝石。去年7月发表,所以仍然合理地近期;)那里的页面比较了这些:

* Ruby 1.8.7 p299
* Ruby 1.9.1 p378
* Ruby 1.9.2 RC2
* IronRuby 1.0 (Mono 2.4.4)
* JRuby 1.5.1 (Java HotSpot(TM) 64-Bit Server VM 1.6.0_20)
* MagLev (rev 23832)
* Ruby Enterprise Edition 2010.02
* Rubinius 1.0.1

可以找到你想要的东西

http://programmingzen.com/2010/07/19/the-great-ruby-shootout-july-2010/

答案 4 :(得分:2)

实际上上面的答案是不正确的,除了mikel的答案,如果你观察到JVM的任何基准,你会发现它很慢,所以想象一下JRuby的性能与CRuby相比。< / p>

就个人而言,我是MRI Ruby的贡献者,我认为自从引入MRI Ruby的YARV VM以来,上面的基准图表根本不是真的,这个版本成为最快的,很多基准测试证明了这一点和#34;参见Pat Shaughnessy的三个着名Ruby解释器MRI Ruby,JRuby和Rubinius&#34;的基准测试和评论。因此,在我看来,由于以下逻辑点,没有任何比较点: -

1-C比Java快得多,因为它直接在硬件上运行并生成机器代码。而JVM生成的Bytecode被认为是中间代码。

2- JRuby包含一个额外的解释步骤,不像MRI Ruby&#34;标记化,解析,AST解析和生成YARV指令&#34;代码生成&#34;最后代码执行&#34;虽然JRuby包含一个额外的阶段。

3- MRI中的垃圾收集Ruby比JRuby中的垃圾收集要快得多,即使它们在标记和扫描垃圾收集技术中引入了一些变化也会更好。

4-如果你浏览大多数使用的公司和技术,他们总是使用MRI Ruby特别是ruby 1.9,我很少看到一家公司使用JRuby,甚至看到很多扩展或贡献,不像MRI Ruby。

最后Ruby 1.8是的,因为它们在AST本身执行代码所以速度较慢,所以他们用来多次解析AST以执行代码。

如果我对任何事情都不对,我希望有人纠正我。

使用RVM或源安装MRI Ruby dude。您将找到许多可与

配合使用的宝石和扩展程序

答案 5 :(得分:2)

许多用户已经就基准测试回答了问题。您的问题专门针对Rails的使用。

我觉得这很不寻常,因为我没有清楚地看到问题的目标。有许多使用MRI,许多人使用JRuby和许多其他人。我在这方面要求稳定性,安全性和可维护性,而不是速度。

然而,MRI与JRuby之间存在重要差异。

MRI使用GIL。这意味着,虽然您可以拥有多个线程,但一次只能有一个线程处于活动状态。在不同的Ruby版本中,线程的实现也可能不同。较新的版本使用操作系统线程(前进很好),旧版本使用绿色线程。

  

MRI中没有真正的并行性。

MRI是多线程的,不是线程安全的,也不是并行的。

JRuby是多线程的,不是线程安全的并行的。

并行性可以改变速度。两者都不是线程安全的,所以无论如何你都必须要处理它。如果你寻找速度并且可以利用并行性,那么我会给JRuby明确的肯定。

同样,在确定MRI和JRuby之间时,我不确定速度是否是最重要的因素。这是生态系统。既然你要求速度我就不会再进一步​​了。