После вот этого поста, сообщающего о сногсшибательном увеличении производительности JRuby в версии 1.7 при работе на OpenJDK 7u2 в 3 раза относительно предыдущих релизов.
Припоминая относительную тормознутость и прожорливость JRuby в 2009м, и вот такую статистику от Programming languages shootout, я решил дать JRuby очередной шанс.
Сравнение не претендует ни на точность измерений, ни на всеобъемлемость тестов, а лишь призвано выяснить, догнал ли JRuby YARV по производительности, или нет. На старт, внимание,
Синтетические тесты интересуют мало, поэтому будем запускать то, чем обычно занимается Ruby:
— шаблонизирование;
— ввод-вывод;
—вычисление чисел Фибоначчи;
— роутинг.
Будем запускать веб-приложение, и измерять его производительность. Нам понадобится httperf
Для каждой версии ruby будем запускать:
Простое приложение:
Возможно, большая ошибка запускать это на WEBrick, но мы сравниваем не веб-сервера, а саму реализацию языка.
Запускаем:
Request rate: 5.7 req/s (175.9 ms/req)
real 1m14.581s
user 0m2.497s
sys 1m7.232s
Request rate: 55.9 req/s (17.9 ms/req)
real 0m8.960s
user 0m0.203s
sys 0m8.433s
Не буду расстраивать поклонников JRuby, но результаты такого теста не утешительны.
Существуют также и альтернативные сравнения, в которых действительно JRuby быстрее YARV в 3 раза.
Поправьте меня, пожалуйста, если я где-то ошибаюсь.
UPD:
В комментариях верно заметили, что улучшения invokedynamic в JRuby нужно включать дополнительной опцией:
real 0m33.078s
user 0m0.930s
sys 0m31.248
Улучшение в целых два раза, но всё равно в 3 раза медленнее, чем YARV. Ещё идеи?
Припоминая относительную тормознутость и прожорливость JRuby в 2009м, и вот такую статистику от Programming languages shootout, я решил дать JRuby очередной шанс.
Сравнение не претендует ни на точность измерений, ни на всеобъемлемость тестов, а лишь призвано выяснить, догнал ли JRuby YARV по производительности, или нет. На старт, внимание,
Установка
sudo pacman -Syu # обновляемся
sudo sudo pacman -S jdk7-openjdk apache-ant # ставим jre7-openjdk-7.b147_2.0-4 и apache ant
rvm install jruby-head ruby-1.9.3p0 # устанавливаем JRuby (75MB OMG!) и YARV 1.9.3
rvm use jruby-head
ruby --version #jruby 1.7.0.dev (ruby-1.8.7-p352) (2011-12-22 3d34ca5) (OpenJDK Client VM 1.7.0_147-icedtea) [linux-i386-java]
Время тестов
Синтетические тесты интересуют мало, поэтому будем запускать то, чем обычно занимается Ruby:
— шаблонизирование;
— ввод-вывод;
—
— роутинг.
Будем запускать веб-приложение, и измерять его производительность. Нам понадобится httperf
sudo sudo pacman -S httperf
Для каждой версии ruby будем запускать:
gem install sinatra slim
Простое приложение:
#!/usr/bin/env ruby
require 'rubygems'
require 'sinatra'
require 'slim'
get '/' do
slim :index
end
get '/2' do
slim :tyndex
end
__END__
@@ layout
html
== yield
@@ index
div.title Hello world!!!
@@ tyndex
div.title Bye world!!!!!
Возможно, большая ошибка запускать это на WEBrick, но мы сравниваем не веб-сервера, а саму реализацию языка.
Запускаем:
ruby config.ru
time httperf --hog --server localhost --port 4567 --num-conn 500 --ra 500
Результаты
JRuby
Request rate: 5.7 req/s (175.9 ms/req)
real 1m14.581s
user 0m2.497s
sys 1m7.232s
YARV
Request rate: 55.9 req/s (17.9 ms/req)
real 0m8.960s
user 0m0.203s
sys 0m8.433s
Заключение
Не буду расстраивать поклонников JRuby, но результаты такого теста не утешительны.
Существуют также и альтернативные сравнения, в которых действительно JRuby быстрее YARV в 3 раза.
Поправьте меня, пожалуйста, если я где-то ошибаюсь.
UPD:
В комментариях верно заметили, что улучшения invokedynamic в JRuby нужно включать дополнительной опцией:
jruby -J-XX:+UseConcMarkSweepGC -J-XX:-UseParNewGC -Xcompile.invokedynamic=false -v config.ru
real 0m33.078s
user 0m0.930s
sys 0m31.248
Улучшение в целых два раза, но всё равно в 3 раза медленнее, чем YARV. Ещё идеи?