はじめに
Rubyでコードのパフォーマンスを計測する際に便利なツールであるbenchmark
について解説します。benchmark
メソッドを使用することで、コードの実行時間を簡単に計測できます。
目次
-
benchmark
メソッドの使い方 - 複数のコードブロックを比較する
- 測定回数を指定してパフォーマンスを計測する
1. benchmark
メソッドの使い方
以下の例では、benchmark
メソッドを使用して、実行時間を計測しています。
benchmark('Benchmarking: unzip') do
#測定したい処理を実装
end
実行結果は以下のように表示されます。
user system total real
Benchmarking: unzip 0.010000 0.000000 0.010000 ( 0.011987)
出力の内容は以下の通りです。
- ラベル "Benchmarking: unzip"
- ユーザーCPU時間 (この例では 0.010000秒)
- システムCPU時間 (この例では 0.000000秒)
- 合計CPU時間 (ユーザーCPU時間 + システムCPU時間、この例では 0.010000秒)
- 経過実時間 (この例では 0.011987秒)
2. 複数のコードブロックを比較する
複数のコードブロックのパフォーマンスを比較する場合、Benchmark.bm
またはBenchmark.benchmark
を使用できます。以下の例では、task1
とtask2
のパフォーマンスを比較しています。
require 'benchmark'
array = (1..10000).to_a
task1 = Proc.new { array.count(&:even?) }
task2 = Proc.new { array.select(&:even?).size }
Benchmark.bm do |x|
x.report("Array#count:") { task1.call }
x.report("Array#select + size:") { task2.call }
end
実行結果は以下のように表示されます。
user system total real
Array#count: 0.001000 0.000000 0.001000 (0.001000)
Array#select + size: 0.002000 0.000000 0.002000 (0.002000)
出力の各部分は以下の通りです。
- ラベル(この例では "Array#count:" と "Array#select + size:")
- ユーザーCPU時間(この例では 0.001000秒 と 0.002000秒)
- システムCPU時間(この例では 0.000000秒 と 0.000000秒)
- 合計CPU時間(ユーザーCPU時間 + システムCPU時間、この例では 0.001000秒 と 0.002000秒)
- 経過実時間(この例では 0.001000秒 と 0.002000秒)
この出力から、Array#count
メソッドを使った方法(task1
)が、Array#select
とArray#size
メソッドを使った方法(task2
)よりも高速であることがわかります。
3. 測定回数を指定してパフォーマンスを計測する
測定回数を指定してパフォーマンスを計測する場合、Benchmark.bmbm
またはBenchmark.measure
を使用できます。以下の例では、task1
とtask2
を1000回実行し、そのパフォーマンスを計測しています。
require 'benchmark'
array = (1..10000).to_a
n = 1000
task1 = Proc.new { array.count(&:even?) }
task2 = Proc.new { array.select(&:even?).size }
Benchmark.bm do |x|
x.report("Array#count (#{n}回):") { n.times { task1.call } }
x.report("Array#select + size (#{n}回):") { n.times { task2.call } }
end