2017-02-23 69 views
0

我試圖用JRuby和Rails診斷性能問題,但沒有多少運氣。基本上,我有一個JRuby on Rails 5應用程序,它將啓動rake任務中的進程。在測試一些rake任務時,我們注意到與我們使用的寫在MRI ruby​​中的舊腳本相比顯着下降,並使用bundle exec ruby <script>調用運行。慢速基本操作JRuby rake任務

在rake任務上下文中對字符串,數組,數字等的基本操作速度要慢5-6倍。在運行此

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 

例如採取這個簡單的測試:

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 

產生這些結果其中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) 

瑞克數字是有點慢,但不是5倍作爲你的榜樣慢。

如果您使用JRuby 1.7.x運行,您可以嘗試將-X + C傳遞給JRuby(JRUBY_OPTS = -X + C)以強制所有文件進行編譯,但有些編譯可能無法成功。

+0

嘿查爾斯!非常感謝花時間看這個。我使用JRuby 9.1.7.0運行,結果絕對符合我的預期。 PS我會提交作爲一個錯誤,但它似乎沒有正確的地方:) –