JRuby on Rails和Ruby on Rails有什么区别?

138

我想尝试使用JRuby和JRuby on Rails。我在寻找有关JRuby on Rails和Ruby on Rails的区别的信息时遇到了麻烦。

我需要注意哪些不同之处?

5个回答

164

JRuby是运行在JVM上的Ruby实现,而Matz's Ruby则是C实现。

需要注意的关键特性包括:

  1. JRuby运行在Java虚拟机上,可以编译或解释成Java字节码。
  2. JRuby可以与Java代码集成。如果你有Java类库(.jar文件),可以在Ruby代码中引用并使用它们。反过来,也可以从Java中调用JRuby代码。JRuby还可以使用JVM和应用程序服务器功能。
  3. JRuby通常托管在Java应用程序服务器中,例如Sun的GlassFish甚至Tomcat Web服务器中。
  4. 虽然你不能使用原生的Ruby gems来与JRuby一起使用,但大多数流行的Ruby库都有JRuby实现。

其他差异列在了JRuby维基上:


谢谢,这几乎回答了我所寻找的一切。 :) - epochwolf
4
它运行的速度比1.9慢一些。 - rogerdpack
1
为了查看JRUBY ON RAILS中的性能差异,建议使用具有足够资源的多核机器。缓慢的数据库查询也会成为瓶颈,导致JRUBY表现类似或比RAILS上的MRI更慢。 JRuby在启动时使用的内存也比MRI显着高。 - Joseph Ravenwolfe
我们使用jruby与Oracle通过VPN进行测试时,性能非常低下(测试运行速度极慢),而且在本地(无需VPN)启动ruby、rails控制台等需要30秒以上,而不是3秒。 - Michael Durrant

63

我对所有回答此问题的内容都缺少一个至关重要的事情感到惊讶,与 GIL 相关。

在 Web 应用程序中(如使用 Rails 构建的应用程序),你应该关心的主要区别是真正的并发("全局解释器锁" free)。当两个线程运行时(例如提供 2 个用户请求),使用 JRuby 可以在单个进程内并发运行它们,而在 MRI 中有 GIL(即使使用 1.9 的本地线程),它会避免并行执行 Ruby 代码。

对于应用程序开发人员来说,这是在考虑 JRuby 时要记住的第一件事情,因为它确实在使用 config.threadsafe! 时表现出色,但需要确保你的代码(以及你的 gem 代码)是 "真正" 线程安全的。


7

我可能错了,但是我认为你可以将JRuby on Rails应用程序打包成一种普通RoR无法做到的方式 - 可以看看Mingle或类似的东西。这使得在不降低价格/开放内部机密的情况下销售成为可能。

话虽如此,我对RoR打包还不够熟悉,所以请勿对我的说法过于认真 :)


1
你说得完全正确,不过要完全做到这一点,你需要像Rawr或Roir gem这样的东西(上次我使用Mingle时,它有未混淆的Ruby文件...)。 - Marnen Laibow-Koser

4

大多数情况下,它应该是一样的。在jRoR中,您可以访问在RoR中无法访问的内容。通常这主要是部署方面的问题。

然而,如果您的RoR应用程序使用本地库,而这些库没有在JVM上运行的等效版本,那么可能会很麻烦。但是,大多数库都有一个非本地版本可用(至少我遇到的流行库都是如此)。


2

这里已经有一些很好的答案了。

eebbesen已经讲解了基础知识,而 kares(他自己!)告诉我们JRuby没有GIL。

我会从更实际的角度补充,我曾经在Ruby on Rails上启动应用程序,然后出于性能原因迁移到了JRuby。

有两个主要的性能优势:在某些情况下,JRuby比Ruby更快,而且,kares提到的全局解释器锁的缺失使我能够进行多线程处理,虽然有些棘手,但解锁了数量级的性能。

一个非常大的Ruby on Rails应用程序移植并在一个小时内运行,包括所有gem。唯一的实际问题是Java的正则表达式与Ruby的略有不同。这是JRuby的巨大成就。


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