如果我使用Ruby on Rails,我应该安装MRI / YARV Ruby还是JRuby?哪个更快?
答案 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的基准测试。如果删除任何实现失败的基准测试,则会得到以下图表。
注意我使用了几何平均值。这是平均性能的更好指标,因为它可以规范异常值和机器规格。
您可以运行的最佳基准将特定于您的应用。如果你正在寻找整体性能,你可能想要使用真正的线程,所以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之间时,我不确定速度是否是最重要的因素。这是生态系统。既然你要求速度我就不会再进一步了。