Ruby フォルダ内にあるものを取得できる「foreach」と「each_child」と「open」と「glob」のパフォーマンスを計測する

Ruby フォルダ内にあるものを取得できる「foreach」と「each_child」と「open」と「glob」のパフォーマンスを計測する

Rubyで、benchmarkを使用して、フォルダ内にあるものを取得できる「foreach」と「each_child」と「open」と「glob」のパフォーマンスを計測するサンプルコードを記述してます。rubyのバージョンは2.7.2を使用してます。

環境

  • OS windows10 pro 64bit
  • ruby 2.7.2p137

パフォーマンス計測

benchmarkを使用して、「foreach」と「each_child」と「open」と「glob」を使用して、フォルダ内にあるものを取得する(. と ..は除く)コードを10万回実行したパフォーマンスを計測するサンプルコードとなります。

require "benchmark"

# 繰り返し回数 10万回
i = 100_000

# 10は、reportラベルに使用する桁数
Benchmark.bm 10 do |r|
  r.report "#foreach" do
    i.times do
      Dir.foreach(".") do |i|
        next if i == "." or i == ".."
      end
    end
  end

  r.report "#each_child" do
    i.times do
      Dir.each_child(".").each do |i|
      end
    end
  end

  r.report "#open" do
    i.times do
      Dir.open(".").each do |i|
        next if i == "." or i == ".."
      end
    end
  end

  r.report "#glob" do
    i.times do
      Dir.glob("*").each do |i|
      end
    end
  end
end

実行結果

<1回目>
                 user     system      total        real
#foreach     2.953000  14.157000  17.110000 ( 17.116834)
#each_child  3.375000  14.172000  17.547000 ( 17.570363)
#open        2.875000  14.250000  17.125000 ( 17.135085)
#glob        4.469000  16.171000  20.640000 ( 20.631108)

<2回目>
                 user     system      total        real
#foreach     3.000000  14.438000  17.438000 ( 17.453493)
#each_child  2.891000  14.328000  17.219000 ( 17.236825)
#open        2.906000  14.312000  17.218000 ( 17.242243)
#glob        3.984000  16.766000  20.750000 ( 20.756050)

<3回目>
                 user     system      total        real
#foreach     3.110000  14.437000  17.547000 ( 17.963086)
#each_child  2.906000  14.641000  17.547000 ( 17.557819)
#open        3.000000  14.297000  17.297000 ( 17.315619)
#glob        4.484000  16.343000  20.827000 ( 20.839256)

glob以外は、ほぼ同じ結果となりました。