概要
バッチ処理の実行環境について、チーム内で議論しました。
その際、「rails runner
はRails
実行環境を毎回読み込むので遅い」とのコメントがありましたので、実際に検証することにしました。
スクリプトの準備
まず、共通で使用するスクリプトを作成します。
- 1から1,000,000までの整数の合計を計算し、処理にかかった時間を取得
- 上記を複数回実行して平均時間を計測する
benchmark_task.rb
def perform_task
sum = 0
(1..1_000_000).each { |i| sum += i }
sum
end
if __FILE__ == $0
iterations = 10
total_time = 0.0
iterations.times do
start_time = Time.now
sum = perform_task
end_time = Time.now
elapsed_time = end_time - start_time
total_time += elapsed_time
puts "Iteration: #{sum}, Time: #{elapsed_time} seconds"
end
average_time = total_time / iterations
puts "Average Elapsed Time: #{average_time} seconds"
end
ruby コマンドでの実行
Ruby環境でスクリプトを実行します。
ruby benchmark_task.rb
実行結果
Iteration: 500000500000, Time: 0.082677 seconds
Iteration: 500000500000, Time: 0.074426 seconds
Iteration: 500000500000, Time: 0.0732 seconds
Iteration: 500000500000, Time: 0.077007 seconds
Iteration: 500000500000, Time: 0.082132 seconds
Iteration: 500000500000, Time: 0.076183 seconds
Iteration: 500000500000, Time: 0.071092 seconds
Iteration: 500000500000, Time: 0.072957 seconds
Iteration: 500000500000, Time: 0.077457 seconds
Iteration: 500000500000, Time: 0.076813 seconds
Average Elapsed Time: 0.0763944 seconds
rails runner
で0.0763944 seconds
よりも遅くなるか検証します。
Rails Runner での実行
rails runner
で同じスクリプトを実行します。
rails runner benchmark_task.rb
実行結果
Iteration: 500000500000, Time: 0.124216 seconds
Iteration: 500000500000, Time: 0.110869 seconds
Iteration: 500000500000, Time: 0.109642 seconds
Iteration: 500000500000, Time: 0.132782 seconds
Iteration: 500000500000, Time: 0.118581 seconds
Iteration: 500000500000, Time: 0.16234 seconds
Iteration: 500000500000, Time: 0.113434 seconds
Iteration: 500000500000, Time: 0.10714 seconds
Iteration: 500000500000, Time: 0.106049 seconds
Iteration: 500000500000, Time: 0.091899 seconds
Average Elapsed Time: 0.1176952 seconds
確かに少し遅いですね...
まとめ
Railsの環境初期化によるオーバーヘッドで
ruby
コマンドと比較すると、少し遅くなっていますね。
Rails環境を読み込む必要がない場合はRails runnerの利用は避けるべきですね。
上記理由でcron
内で複数のrails runner
を使用していましたが、テコ入れしました。