缓慢的基本操作 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) 以强制所有文件可以编译,但有些可能编译不成功
我正在尝试诊断 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) 以强制所有文件可以编译,但有些可能编译不成功