StringとArrayでgrep検索した時の速度

ruby-2.1.0

テキストファイルから読んだ文字列郡に指定の文字が含まれているかを確認したかった。
その時に配列と文字列で検索したときにどっちが早いのか。

Rubyスクリプト

なんとなく文字列が含まれている時と含まれていない時も計った。
Fileにはreadメソッドで文字列で、readlinesメソッドで1行を配列で取り出せる。

require 'benchmark'

puts Benchmark::CAPTION
passwords = File.open("app/validators/data/easy_passwords.txt").read

TIME = 10000

p "該当しない時"
puts Benchmark.measure{
  TIME.times do                                                                                                                                                                    
    passwords.include?  "passahogefofdkokfdo"
  end
}

p "該当する時"
puts Benchmark.measure{
  TIME.times do
    passwords.include?("pass")
  end
}

結果

文字列

File.open("app/validators/data/easy_passwords.txt").read.size # => 25589

      user     system      total        real
"該当しない時"
  0.090000   0.000000   0.090000 (  0.090129)
"該当する時"
  0.000000   0.000000   0.000000 (  0.002243)
配列

File.open("app/validators/data/easy_passwords.txt").readlines.size #=> 3546

      user     system      total        real
"該当しない時"
  1.740000   0.000000   1.740000 (  1.749292)
"該当する時"
  1.780000   0.000000   1.780000 (  1.788436)

配列だと要素毎に文字列インスタンスがあるためオーバーヘッドが多いし、全要素回すので遅いとかそんな感じな雰囲気。

まとめ

試してないけど配列でinclude?するよりもjoinとかで文字列にしてからinclude?したほうが早い説。
String#include?のほうが早い。