2017-02-23 17 views
0

Я пытаюсь диагностировать проблемы с работой с JRuby и Rails без большой удачи.Медленные основные операции JRuby rake task

По сути, у меня есть приложение JRuby on Rails 5, которое будет запускать процессы в рейк-задачах. При тестировании некоторых рейк-задач мы заметили значительное замедление по сравнению с нашими старыми сценариями, которые мы использовали, которые были написаны в рубине MRI и выполнялись с использованием вызова bundle exec ruby <script>.

Основные операции над строками, массивами, числами и т. Д. В контексте задачи рейка в 5-6 раз медленнее. Например, возьмем этот простой тест:

bin/rake performance_test:start 

где performance_test.rake является:

namespace :performance_test do 
    desc 'Test Performance' 
    task :start do 
    Benchmark.bmbm do |x| 
     x.report ('double') do 
     100_000_000.times do 
      "Hello world!" 
     end 
     end 
    end 
    end 
end 

производит эти результаты:

Rehearsal ------------------------------------------ 
double 27.570000 0.630000 28.200000 (27.714908) 
-------------------------------- total: 28.200000sec 

      user  system  total  real 
double 28.050000 0.750000 28.800000 (29.864897) 

во время работы этого:

jruby -G performance_test.rb 

где performance_test.rb:

require 'require_all' 
require 'bundler' 
Bundler.require(:default) 
require_all Dir.glob('lib/extensions/*.rb') 

Benchmark.bmbm do |x| 
    x.report ('double') do 
    100_000_000.times do 
     "Hello world!" 
    end 
    end 
end 

дает мне эти результаты:

Rehearsal ------------------------------------------ 
double 4.930000 0.240000 5.170000 ( 5.639570) 
--------------------------------- total: 5.170000sec 

      user  system  total  real 
double 4.420000 0.180000 4.600000 ( 5.538717) 

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

ответ

0

Вы бы, вероятно, получите наше внимание лучше, если вы подали это как ошибку JRuby, несмотря на то, что это на самом деле не ошибка :-)

Я считаю, что ваши номера, вероятно, под JRuby 1.7, или ранняя версия JRuby 9k, которые не блокировали JIT самостоятельно. Вот мои результаты по JRuby 9k мастера (9.1.8.0):

~/projects/jruby/tmp $ jruby performance_test.rb 
Rehearsal ------------------------------------------ 
double 3.180000 0.130000 3.310000 ( 2.801371) 
--------------------------------- total: 3.310000sec 

      user  system  total  real 
double 2.740000 0.030000 2.770000 ( 2.700693) 

~/projects/jruby/tmp $ rake performance_test:start 
Rehearsal ------------------------------------------ 
double 3.890000 0.110000 4.000000 ( 3.499264) 
--------------------------------- total: 4.000000sec 

      user  system  total  real 
double 3.430000 0.040000 3.470000 ( 3.382129) 

граблями цифры немного медленнее, но не 5x медленнее, как в вашем примере.

Если вы работаете с JRuby 1.7.x, вы можете попробовать передать -X + C в JRuby (JRUBY_OPTS = -X + C), чтобы принудительно скомпилировать все файлы, но есть некоторые, которые могут не скомпилировать ,

+0

Эй, Чарльз! Большое спасибо за то, что нашли время, чтобы посмотреть на это. Я работал с JRuby 9.1.7.0, и результаты, безусловно, соответствовали тому, что я ожидал. PS Я бы подал в качестве ошибки, но он не казался правильным местом для нее :) –