0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Rubyでパフォーマンス計測

Last updated at Posted at 2023-05-05

はじめに

Rubyでコードのパフォーマンスを計測する際に便利なツールであるbenchmarkについて解説します。benchmarkメソッドを使用することで、コードの実行時間を簡単に計測できます。

目次

  1. benchmarkメソッドの使い方
  2. 複数のコードブロックを比較する
  3. 測定回数を指定してパフォーマンスを計測する

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を使用できます。以下の例では、task1task2のパフォーマンスを比較しています。

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#selectArray#sizeメソッドを使った方法(task2)よりも高速であることがわかります。

3. 測定回数を指定してパフォーマンスを計測する

測定回数を指定してパフォーマンスを計測する場合、Benchmark.bmbmまたはBenchmark.measureを使用できます。以下の例では、task1task2を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
0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?