Срочно обновляем RVM (Ruby Version Manager)

Совсем недавно во многих ruby-блогах, сообществах, да и на хабре, было написано немало постов о том что RVM дурно влияет на производительность MRI-версии ruby (официальный интерпретатор языка) по причине того что установщик не учитывает оптимизации компилятора GCC. Конечно для этого недуга были «лекарства», но применять их приходилось ручками, причем довольно-таки прямыми. Так вот, спешу всех обрадовать что в последних версиях RVM (начиная с версии 1.17.0) ситуация изменилась, и конечно же в лучшую сторону, теперь Вы снова можете полностью положится на менеджера версий ruby. Все что Вам нужно сделать — это обновиться до последней версии.

Для тех кто не умеет или забыл как это делается, подскажу.
Запускаем терминал, и пишем:
$ rvm get stable

RVM тянет последнюю стабильную версию себя, перезапускается, и выводит стандартное сообщение с результатом обновления и благодарностями за использование от небезызвестного Уэйна Сегвина (Wayne E. Seguin), автора данного пакета.

После того как RVM обновлен, Вам необходимо перекомпилировать установленные MRI версии ruby, а еще лучше — установить последнюю. На момент написания данного поста, последние стабильные версии это: RVM — 1.17.2 и Ruby — 1.9.3-p327. Перекомпилировать ruby с помощью RVM очень просто:
$ rvm reinstall 1.9.3

Для того чтобы использовать свежеустановленную версию ruby по умолчанию, выполните:
$ rvm use 1.9.3 --default

Помимо процессорных оптимизаций, RVM теперь знает про патч funny-falcon'а и ставит его со всеми последними версиями для которых он существует. Прирост производительности очевиден, на моем Intel® Core(TM) i5-2320 CPU @ 3.00GHz с четырьмя гигами ОЗУ под Ubuntu 12.04, типичный бенчмарк дает следующие результаты:

До (RVM — 1.16.17, Ruby — 1.9.3-p286)
$ time ruby -e "count = 0; while(count < 100000000); count = count + 1; end; puts count"
100000000

real    0m5.303s
user    0m5.244s
sys     0m0.016s

После (RVM — 1.17.2, Ruby — 1.9.3-p327)
$ time ruby -e "count = 0; while(count < 100000000); count = count + 1; end; puts count"
100000000

real    0m1.940s
user    0m1.932s
sys     0m0.004s

Ну вот собственно и все. Спасибо за внимание, как говорится — Happy Hacking!

Update: для пользователей Mac OS X 10.6 и выше.
Для явной компиляции при установке Ruby, возможно потребуется добавить опцию --with-gcc=clang, то есть:
$ rvm reinstall 1.9.3 --with-gcc=clang

Спасибо пользователю virusman за эту наводку.
Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 30

    0
    производительность RMI-версии

    наверное MRI-версии?
      0
      Ой ссори! Сейчас исправим…
        +3
        О таком лучше в ЛС писать.
          +2
          согласен, исправлюсь
        0
        Спасибо за алерт, сейчас же переустановлю все на дев-машине.
          0
          У нас уже недели две на всех дев машинах и на стейджинге. Кайфуем, полет нормальный :)
            0
            Вчера обновил боевую версию, предварительно конечно прогнав все функциональные тесты. Пока вроде тоже все нормуль, если что пойдет не так — обязательно сообщу.
            0
            Всегда пожалуйста! :)
            0
            После патча время тестов сократилось где то на 15% (9 минут против 10.5)
              +2
              После установки может слететь настройка какую версию руби использовать по умолчанию, если у вас стоит ещё какаято версия руби, она будет использоваться по умолчанию.

              Посмотреть список установленных руби:
              rvm list rubies

              Посмотреть какая версия по умолчанию:
              rvm list default

              Выбрать которую установили только что:
              rvm --default use 1.9.3-p327

              Так, на всякий случай оставлю тут.
                0
                Что-то у меня с rvm 1.17.3 и Ruby 1.9.3-p327 этот тест работает все 8 секунд, с performance патчем, как описывалось на хабре недавно — чуть больше 2-х секунд. Вы уверены, что прогоняете тест без патча?
                  0
                  На все 99.99% :)
                  0
                  Может кто подскажет почему каждый раз в новой консоли приходится делать rvm --default use? Иначе ruby не подхватывается. Эта проблема еще актуальна в shell скриптах — rvm --default use там просто не работает, из-за этого не получается запустить никакой ruby код из shell скрипта, валится ошибка — «require: command not found».
                    0
                    Попробуйте
                    rvm use --default

                    нет, без разницы, виноват
                      +3
                      У Вас
                      $ type rvm | head -1

                      выдает rvm is a function?
                      Если нет то попробуйте добавить две следующующие строчки в конец вашего .bashrc:
                      
                      PATH=$PATH:$HOME/.rvm/bin # Add RVM to PATH for scripting
                      [[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session
                      
                        0
                        Такая запись есть, но в shell скриптах rvm мертвый:

                        rvm is /Users/mbektimirov/.rvm/bin/rvm
                        
                        RVM is not a function, selecting rubies with 'rvm use ...' will not work.
                        
                        You need to change your terminal emulator preferences to allow login shell.
                        Sometimes it is required to use `/bin/bash --login` as the command.
                        Please visit https://rvm.io/integration/gnome-terminal/ for a example.
                        


                        Logging shell, естественно, стоит в iTerm. Может дело в zsh?
                          +1
                          Попробуйте добавить эти строки в .bash_profile или .zshrc в завсимости от того какой терминал используется, у меня в оба файла RVM прописался автоматически, но его не было в .bashrc и я добавил его туда ручками.
                          Я юзаю GNOME Terminal.
                      +2
                      RVM 1.15.8
                      [~] ruby -v
                      ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-darwin12.2.0]
                      [~] time ruby -e "count = 0; while(count < 100000000); count = count + 1; end; puts count"
                      100000000
                      
                      real	0m2.211s
                      user	0m2.171s
                      sys	0m0.035s
                      


                      RVM 1.17.3
                      [~] ruby -v
                      ruby 1.9.3p327 (2012-11-10 revision 37606) [x86_64-darwin12.2.0]
                      [~] time ruby -e "count = 0; while(count < 100000000); count = count + 1; end; puts count"
                      100000000
                      
                      real	0m2.191s
                      user	0m2.157s
                      sys	0m0.031s
                      


                      Разница вообще ни о чем. ЧЯДНТ?

                      PS. На всякий случай: OS X 10.8.2; 2.66 Intel Core i7; 8GB 1067 MHz DDR3;
                        0
                        Такое тоже возможно, с радостью проверил бы разницу будь у меня такой Мак :)
                        Если Вас это не сильно затруднит, попробуйте проверить флаги оптимизации скомпилированных с помощью RVM рубей.

                        Это можно сделать вот таким способом:
                        ruby -r rbconfig -e 'puts RbConfig::CONFIG["CFLAGS"]'
                        

                        Вам по идее даже не нужно возвращать старую RVM, у Вас должна была остаться старая версия ruby 1.9.3-p194, если конечно Вы не перекомпилировали её заодно. Просто переключитесь на предыдущую версию. Если возникнут какие нибудь вопросы — милости просим в ЛС, буду рад помочь :)
                          0
                          Хмм…

                          для ruby 1.9.3p327:
                          -O3 -ggdb -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Werror=pointer-arith -Werror=write-strings -Werror=declaration-after-statement -Werror=shorten-64-to-32 -Werror=implicit-function-declaration -fno-common -pipe

                          для предыдущей версии (p194, ставил летом на старом rvm, никаких дополнительных флагов руками вроде бы не выставлял, только rvm install 1.9.3, насколько я помню):
                          -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Werror=pointer-arith -Werror=write-strings -Werror=declaration-after-statement -Werror=shorten-64-to-32 -Werror=implicit-function-declaration -fno-common -pipe
                            0
                            Ну вот собственно и они, в обоих случаях :)

                            В моём случае это:
                            mercurial@tuxpc:~$ rvm use 1.9.3-p286
                            Using /home/mercurial/.rvm/gems/ruby-1.9.3-p286
                            mercurial@tuxpc:~$ ruby -r rbconfig -e 'puts RbConfig::CONFIG["CFLAGS"]'
                            -I/home/mercurial/.rvm/rubies/ruby-1.9.3-p286/include -fPIC
                            
                            mercurial@tuxpc:~$ rvm use default
                            Using /home/mercurial/.rvm/gems/ruby-1.9.3-p327
                            mercurial@tuxpc:~$ ruby -r rbconfig -e 'puts RbConfig::CONFIG["CFLAGS"]'
                             -O3 -ggdb -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Werror=pointer-arith -Werror=write-strings -Werror=declaration-after-statement -Werror=implicit-function-declaration  -fPIC
                            
                              0
                              А у меня обратная фигня, вывод после обновления rvm и выполнения rvm reinstall 1.9.3:
                              $ ruby -r rbconfig -e 'puts RbConfig::CONFIG["CFLAGS"]'
                              -I/Users/mpapis/.sm/pkg/active/include -pipe
                              

                              Т.е. он решил не перекомпилить, а скачал бинарник…
                              Результаты до/после обновления тоже идентичны.
                              Mac OS X 10.8.2
                                +1
                                По всей видимости идентично плохи :)
                                Попробуйте удостовериться что Вы перекомпилировали и переключились на свежую версию.
                                И если можно конфигурацию железа и название ОСи.
                                0
                                И после rvm use 1.9.3-p327 --default?
                                Можно удостовериться используя ruby --version
                              0
                              Ну, это говорит о том что у Вас в обоих случаях используются флаги оптимизаций
                              (как минимум CFLAGS="-march=corei7 -O3 -pipe"), возможно руби был перекомпилен каким то образом по походу дела или же под маком эта фича уже давно актуальна. Было бы здорово если бы ещё кто нибудь на маке проверил.
                                0
                                Не только под маком, под GNU/Linux у меня было то же самое, ещё в апреле версия 1.9.3 скомпилировалась RVM с флагом -O3, без к-л доп.настроек. Не знаю от чего это зависело раньше, но масштабность проблемы явно преувеличили на пару порядков… Очень похоже, что компиляция без флагов оптимизации была довольно редким явлением.
                                Что касается патча от funny falcon, он ускоряет в случаях увесистых задач, на приведённый синтетический тест он вообще никак не влияет.
                            0
                            А у меня rvm 1.17.3 установил ruby 1.9.3 такой:
                            ruby 1.9.3p327 (2012-11-10) [x86_64-darwin12.2.0]
                            и он работает больше 8 секунд.
                            А вот с performance патчем:
                            ruby 1.9.3p327 (2012-11-10 revision 37606) [x86_64-darwin12.2.0]
                            этот работает за 2 секунды, как и положено. Тоже мак х64.
                              0
                              Но я делал через удаление 1.9.3. Возможно, если обновлять, он подхватывает патч?
                                0
                                В апдейте уже указали решение, у меня сработало, спасибо.

                            Only users with full accounts can post comments. Log in, please.