Pull to refresh

Сравнение производительности JRuby 1.7 на OpenJDK b147 и YARV 1.9.3p0

Reading time2 min
Views1.5K
После вот этого поста, сообщающего о сногсшибательном увеличении производительности JRuby в версии 1.7 при работе на OpenJDK 7u2 в 3 раза относительно предыдущих релизов.

Припоминая относительную тормознутость и прожорливость 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. Ещё идеи?
Tags:
Hubs:
Total votes 16: ↑7 and ↓9-2
Comments8

Articles