RubyではArrayよりSetの方が高速に検索(include?
)できるとのことですが、実際どのぐらいの差があるか調べてみました。
実行環境
以下の通りです。
$ ruby -v ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin15]
計測に使うコード
require './process_measure.rb' require 'set' array = Array.new set = Set.new 10001.times { |i| array.push("#{i}") } 10001.times { |i| set.add("#{i}") } 6.times do |i| str = "#{i * 2000}" puts "-------------------- #{str} --------------------" measure_do { array.include?(str) } measure_do { set.include?(str) } end
※ process_measure.rb
については、以下の記事をご参照ください。
計測結果
$ ruby set_array.rb -------------------- 0 -------------------- user system total real 0.000000 0.000000 0.000000 ( 0.000007) user system total real 0.000000 0.000000 0.000000 ( 0.000005) -------------------- 2000 -------------------- user system total real 0.000000 0.000000 0.000000 ( 0.000071) user system total real 0.000000 0.000000 0.000000 ( 0.000004) -------------------- 4000 -------------------- user system total real 0.000000 0.000000 0.000000 ( 0.000115) user system total real 0.000000 0.000000 0.000000 ( 0.000004) -------------------- 6000 -------------------- user system total real 0.000000 0.000000 0.000000 ( 0.000170) user system total real 0.000000 0.000000 0.000000 ( 0.000004) -------------------- 8000 -------------------- user system total real 0.000000 0.000000 0.000000 ( 0.000395) user system total real 0.000000 0.000000 0.000000 ( 0.000008) -------------------- 10000 -------------------- user system total real 0.000000 0.000000 0.000000 ( 0.000576) user system total real 0.000000 0.000000 0.000000 ( 0.000008)
考察
Setの方が明らかに高速ですね。 Arrayは先頭から順番に検索するんでしょうか? 検索対象が後ろになればなるほど遅くなる傾向にあります。
Arrayは便利なメソッドがたくさんありますが、追加/削除/検索しかせず、値が重複しないならばSetを使う方が良いですね。