我想尝试使用JRuby和JRuby on Rails。我在寻找有关JRuby on Rails和Ruby on Rails的区别的信息时遇到了麻烦。
我需要注意哪些不同之处?
我想尝试使用JRuby和JRuby on Rails。我在寻找有关JRuby on Rails和Ruby on Rails的区别的信息时遇到了麻烦。
我需要注意哪些不同之处?
JRuby是运行在JVM上的Ruby实现,而Matz's Ruby则是C实现。
需要注意的关键特性包括:
其他差异列在了JRuby维基上:
我对所有回答此问题的内容都缺少一个至关重要的事情感到惊讶,与 GIL 相关。
在 Web 应用程序中(如使用 Rails 构建的应用程序),你应该关心的主要区别是真正的并发("全局解释器锁" free)。当两个线程运行时(例如提供 2 个用户请求),使用 JRuby 可以在单个进程内并发运行它们,而在 MRI 中有 GIL(即使使用 1.9 的本地线程),它会避免并行执行 Ruby 代码。
对于应用程序开发人员来说,这是在考虑 JRuby 时要记住的第一件事情,因为它确实在使用 config.threadsafe!
时表现出色,但需要确保你的代码(以及你的 gem 代码)是 "真正" 线程安全的。
我可能错了,但是我认为你可以将JRuby on Rails应用程序打包成一种普通RoR无法做到的方式 - 可以看看Mingle或类似的东西。这使得在不降低价格/开放内部机密的情况下销售成为可能。
话虽如此,我对RoR打包还不够熟悉,所以请勿对我的说法过于认真 :)
大多数情况下,它应该是一样的。在jRoR中,您可以访问在RoR中无法访问的内容。通常这主要是部署方面的问题。
然而,如果您的RoR应用程序使用本地库,而这些库没有在JVM上运行的等效版本,那么可能会很麻烦。但是,大多数库都有一个非本地版本可用(至少我遇到的流行库都是如此)。
这里已经有一些很好的答案了。
eebbesen已经讲解了基础知识,而 kares(他自己!)告诉我们JRuby没有GIL。
我会从更实际的角度补充,我曾经在Ruby on Rails上启动应用程序,然后出于性能原因迁移到了JRuby。
有两个主要的性能优势:在某些情况下,JRuby比Ruby更快,而且,kares提到的全局解释器锁的缺失使我能够进行多线程处理,虽然有些棘手,但解锁了数量级的性能。
一个非常大的Ruby on Rails应用程序移植并在一个小时内运行,包括所有gem。唯一的实际问题是Java的正则表达式与Ruby的略有不同。这是JRuby的巨大成就。