Отключение YARV-компилятора Ruby 1.9.x - PullRequest
0 голосов
/ 27 июля 2010

Существует очень заметная разница во времени запуска приложения между запуском моих спецификаций из командной строки с 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.

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

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

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

Ответы [ 3 ]

5 голосов
/ 27 июля 2010

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

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

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

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

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

4 голосов
/ 27 июля 2010

В настоящее время нет способа отключить YARV, просто потому, что MRI 1.9 only включает виртуальную машину, а не интерпретатор.Поддержание обоих было бы слишком большой работой для основной команды.

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

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

0 голосов
/ 03 августа 2010

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

...