缓慢的基本操作 JRuby rake 任务

Slow basic operations JRuby rake task

我正在尝试诊断 JRuby 和 Rails 的性能问题,但运气不佳。

基本上,我在 Rails 5 应用程序上有一个 JRuby,它将启动 rake 任务中的进程。在测试某些 rake 任务时,我们注意到与使用 bundle exec ruby <script> 调用在 MRI ruby 和 运行 中编写的旧脚本相比,速度明显变慢。

在 rake 任务的上下文中对字符串、数组、数字等的基本操作要慢 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 选项,并搜索了这方面的信息,但没有成功。如果我能找到这个问题的根本原因以及我将如何解决这个问题,那就太好了。

如果您将其作为 JRuby 错误提交,可能会更好地引起我们的注意,即使它不是真正的错误:-)

我相信你的数字可能在 JRuby 1.7 下,或者是 JRuby 9k 的早期版本,没有独立 JIT 编译块。这是我在 JRuby 9k master (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) 以强制所有文件可以编译,但有些可能编译不成功