JRuby on Rails против Ruby on Rails, в чем разница?

135

Я хочу попробовать JRuby и JRuby на Rails. У меня проблемы с поиском информации о разнице между JRuby on Rails и Ruby on Rails.

Какие различия мне нужно искать?

epochwolf
источник

Ответы:

160

JRuby - это реализация Ruby, которая работает на JVM, а Matz's Ruby - это реализация на C.

Ключевые особенности, на которые следует обратить внимание:

  1. JRuby работает на виртуальных машинах Java и компилируется или интерпретируется как байт-код Java.
  2. JRuby может интегрироваться с кодом Java. Если у вас есть библиотеки классов Java (.jar), вы можете ссылаться на них и использовать их в коде Ruby с помощью JRuby. В другом направлении вы также можете вызывать код JRuby из Java. JRuby также может использовать возможности JVM и сервера приложений.
  3. JRuby обычно размещается на серверах приложений Java, таких как Sun GlassFish или даже веб-сервер Tomcat.
  4. Хотя вы не можете использовать нативные гемы Ruby с JRuby, для большинства популярных библиотек Ruby есть реализации JRuby.

Есть и другие отличия, которые перечислены на вики JRuby:

user23117
источник
Спасибо, что отвечает практически на все, что я искал. :)
epochwolf
4
о, и он работает немного медленнее, чем 1.9
rogerdpack
1
Чтобы увидеть различия в производительности в JRuby on Rails, рекомендуется иметь многоядерный компьютер с достаточными ресурсами. Медленные запросы к базе данных также могут стать узким местом JRuby и привести к тому, что он будет работать аналогично или медленнее, чем MRI на Rails. JRuby также использует значительно больше памяти, чем МРТ.
Джозеф Равенвольф
Мы достигли огромной производительности благодаря использованию jruby с Oracle через VPN (тесты выполняются невероятно медленно), а также локально (без VPN): только запуск ruby, консоли rails и т. Д. Занимает 30 секунд + вместо 3.
Майкл Даррант,
57

Я удивлен, что во всех ответах на этот вопрос отсутствует важная вещь, связанная с GIL .

Основное отличие, которое вы должны заботиться о ESP. в веб-приложениях, например, построенных с помощью Rails, настоящий параллелизм («Global Interpreter Lock» бесплатный). Когда два потока работают (например, обслуживают 2 пользовательских запроса) с JRuby, они могут работать одновременно в одном процессе, тогда как в MRI есть GIL (даже с собственными потоками 1.9), который избегает параллельного выполнения кода Ruby.

Для разработчика приложений это первое, что нужно иметь в виду при рассмотрении JRuby, поскольку он действительно хорош, config.threadsafe!но требует от вас, чтобы ваш код (и ваш гем-код) были «действительно» поточно-ориентированными.

Kares
источник
7

Я могу ошибаться, но я думаю, что вы можете упаковать приложение JRuby on Rails так, как это невозможно сделать с обычным RoR - посмотрите на Mingle или подобное. Позволяет продавать без опускания штанов / открытия комоно.

Тем не менее, я недостаточно знаком с упаковкой RoR, так что не держите меня за это :)

Ник Мудрый
источник
1
Вы абсолютно правы в этом, хотя вам понадобится что-то вроде драгоценного камня Rawr или Roir, чтобы сделать это полностью (в прошлый раз, когда я использовал Mingle, у него были не скрытые файлы Ruby ...).
Марнен Лайбоу-Козер
3

в основном это должно работать так же. в jRoR вы можете получить доступ к тому, чего не было бы в RoR. Обычно это в основном проблема развертывания.

Однако, если ваше приложение RoR использует собственные библиотеки, которые не имеют эквивалента, который работает на JVM, это может быть проблемой. Однако большинство библиотек имеют не родную версию (по крайней мере, популярные, с которыми я сталкивался).

Майкл Нил
источник
0

Здесь уже есть несколько отличных ответов.

Эббесен уже охватил основы, и Карес (сам!) сказал нам, что у JRuby нет GIL.

Добавлю с практической точки зрения, я запустил приложения на Ruby on Rails, а затем мигрировал на JRuby по соображениям производительности.

Было два основных выигрыша в производительности: JRuby (или был) просто быстрее, чем Ruby, в некоторых обстоятельствах, и два, отсутствие упоминания Кареса о Глобальной блокировке интерпретатора позволило мне выполнять многопоточность, которая, хотя и сложная, открыла преимущества производительности на несколько порядков. ,

Очень большое приложение Ruby on Rails портировано и запущено за час, гемы и все такое. Единственный фактический сбой заключался в том, что регулярные выражения Java немного отличаются от регулярных в Ruby. Это монументальное достижение со стороны JRuby.

user2057354
источник