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?のほうが早い。