2010-07-26 12 views
0

Существует очень заметная разница в времени запуска приложения между запуском моих спецификаций из командной строки с ruby ​​1.9.x против 1.8.7. Мое приложение запускается гораздо быстрее с ruby ​​1.8.7, чем с ruby ​​1.9.1 или 1.9.2. Разница инициации приложения составляет приблизительно 18 секунд. Для моего приложения требуется около 5 секунд для инициализации с 1,8,7 и 23 секунды с 1,9,1 и 1,9,2.Отключение компилятора YARV от Ruby 1.9.x

Время инициализации приложения не имеет большого значения для производства, но это очень важно для разработки BDD. Каждый раз, когда я меняю свой код и запускаю свои спецификации, я должен ждать еще 18 секунд на итерацию.

Я предполагаю, что это время инициализации приложения приписывается YARV-компиляции байт-кода, когда мое приложение инициализируется.

Я прав, что мой YARV замедляет мою инициализацию приложения, и есть способ отключить YARV в командной строке. Было бы очень приятно отключить YARV только тогда, когда я буду использовать свои спецификации.

+0

Вот некоторые из них: [Рубиний] (http://rubini.us/), [JRuby] (http://jruby.org/), [MagLev] (http://ruby.gemstone.com /). – Adrian

+0

Новая версия Rail 3 rc1 и Bundler rc1 значительно сократила время инициализации моего приложения с 23 секунд до 10 секунд. Я не закрывал свой пакет, но я также не блокировал свой пакет при использовании 1.8.7 с моим приложением, и я получал значительно лучшие времена инициализации. Теперь, используя новые версии rc1 Bundler и Rails с рубином 1.9.2, мое время запуска сократилось примерно до 10 секунд против 5 секунд с 1,8.7. –

ответ

5

YARV является чистым компилятором Ruby. Если вы отключите его, ничего не останется.

Точнее: YARV представляет собой многофазную реализацию, где каждая из фаз является одномодовой. Он состоит из компилятора Ruby-to-YARV и интерпретатора YARV. Если вы удалите компилятор, единственное, с чем вы остались, это интерпретатор байт-кода YARV. Если вы не хотите начинать писать свое приложение в байт-коде YARV, этот интерпретатор вам не пригодится.

Это в отличие от реализаций в смешанном режиме, таких как JRuby и IronRuby, которые реализуют несколько режимов выполнения (в частности, как компилятор, так и интерпретатор) в фазе один. Если вы выключите компилятор в JRuby или IronRuby, у вас все еще останется работоспособный механизм выполнения, потому что оба они также содержат интерпретатор. Фактически, JRuby фактически начал работать как чистый интерпретатор и позже добавил компилятор, а IronRuby начал работать как чистый компилятор, и они добавили переводчика ровно из-за той же проблемы, что и вы: компиляция модульных тестов - это просто отходы времени.

Единственная интерпретированная реализация Ruby 1.9 прямо сейчас - JRuby. Конечно, у вас есть все накладные расходы JVM, с которыми приходится иметь дело. Лучшее, что вы можете сделать, это попробовать, как быстро вы сможете запустить JRuby (используйте ночные версии 1.6.0.dev от http://CI.JRuby.Org/snapshots/, так как поддержка 1.9 и время запуска в настоящий момент сильно работают) с использованием очень быстрого начиная с JVM, ориентированного на рабочий стол, например, IBM J9 или попробуйте поддержку Nailgun от JRuby, которая поддерживает JVM в фоновом режиме.

Вы также можете попытаться избавиться от RubyGems, который обычно съедает довольно много времени запуска, особенно на YARV. (Используйте опцию --disable-gem командной строки, чтобы действительно избавиться от него.)

+0

Благодарим вас за отличную справочную информацию. Мне нужно RubyGems, так как мое приложение - это приложение Rails 3 со многими зависимостями, связанными с самоцветом, но я думаю, что я дам JRuby, так как он совместим с 1.9. В настоящее время мое приложение требует совместимости 1.9.2 из-за моих зависимостей, и я надеюсь, что JRuby совместим с 1.9.2. Если JRuby не сработает для меня, мне придется понизить мой код до 1,8.7. –

4

Там в настоящее время нет возможности отключить YARV, просто потому, что МРТ 1,9 только включает в себя виртуальную машину, а не переводчик. Поддержание обоих было бы слишком большой работой для основной команды.

В будущем, вероятно, будут способы кэширования генератора байт-кода YARV (например, Rubinius). На данный момент нет способа загрузить такой байт-код через Ruby (см. #971), но вы можете легко написать расширение C, которое его выполняет.

Однако, я бы сказал, что 18 секунд способ слишком много, и это, вероятно, ошибка.Я знаю, что в рубиновом ядре есть некоторые потоки, в которых обсуждается медлительность require; может быть, вы найдете там что-то интересное!

+1

+1, я забыл о ошибках 'require'. –

+0

Спасибо за совет. Мое приложение в настоящее время требует 1.9.2 из-за зависимостей. Я хотел бы использовать Rubinius, но я не считаю, что он поддерживает совместимость 1.9.x. Это хорошо знать о требовании ошибки. Я сомневаюсь, что у меня будет время, чтобы обойти эту проблему. –

0

следующий RC версии 1.9.2 может быть быстрее, так как он не загружает $: со всеми вашими драгоценными камнями.