Ruby 配列からnilを削除できる「compact」と「delete_if」と「reject」のパフォーマンスを計測する

Ruby 配列からnilを削除できる「compact」と「delete_if」と「reject」のパフォーマンスを計測する

Rubyで、benchmarkを使用して、配列からnilを削除できる「compact」と「delete_if」と「reject」のパフォーマンスを計測するサンプルコードを記述してます。rubyのバージョンは2.7.2を使用してます。

環境

  • OS windows10 pro 64bit
  • ruby 2.7.2p137

パフォーマンス計測

benchmarkを使用して、「compact」と「delete_if」と「reject」を使用して、配列からnilを削除するコードを1000万回実行したパフォーマンスを計測するサンプルコードとなります。

require 'benchmark'

# 繰り返し回数 1000万回
i = 10000000

arr = [ "a", nil, "b", nil, "c"]

# 10は、reportラベルに使用する桁数
Benchmark.bm 10 do |r|

  r.report '#compact!' do
    i.times do
      arr.compact!
    end
  end

  r.report '#delete_if' do
    i.times do
      arr.delete_if{ |x| x.nil? }
    end
  end

  r.report '#reject!' do
    i.times do
      arr.reject!{ |x| x.nil? }
    end
  end

end

実行結果

<1回目>
                 user     system      total        real
#compact!    0.641000   0.000000   0.641000 (  0.635823)
#delete_if   2.516000   0.000000   2.516000 (  2.559678)
#reject!     2.359000   0.016000   2.375000 (  2.373555)

<2回目>
                 user     system      total        real
#compact!    0.641000   0.000000   0.641000 (  0.643726)
#delete_if   2.453000   0.000000   2.453000 (  2.467691)
#reject!     2.516000   0.016000   2.532000 (  2.615345)

<3回目>
                 user     system      total        real
#compact!    0.640000   0.000000   0.640000 (  0.640501)
#delete_if   2.485000   0.000000   2.485000 (  2.815094)
#reject!     2.500000   0.000000   2.500000 (  2.644525)

compactが、一番パフォーマンスは良さそうです。