grepの速度測定

30分プログラム、その164。grepの速度を測っていみる。
Rubyである文字列を含むファイルを検索する場合、自前で実装するのと、grepコマンド使うののどちらが速いか測定してみた。
検索するファイルの拡張子も指定したかったので、findとも組合せている。

使い方

# findコマンドとgrepコマンド
$ ruby grep_bench.rb --find-grep ~/tmp/howm foo
/home/mzp/howm/0000-00-00-000000.howm
/home/mzp/howm/2007/08/2007-08-11-223618.howm
....

# Dir.[]とgrepコマンド
$ ruby grep_bench.rb --dir-grep ~/tmp/howm foo
/home/mzp/howm/0000-00-00-000000.howm
/home/mzp/howm/2007/08/2007-08-11-223618.howm
....

# Dir.[]とeach。全部Rubyで実装した場合。
$ ruby grep_bench.rb --dir-each ~/tmp/howm foo
/home/mzp/howm/0000-00-00-000000.howm
/home/mzp/howm/2007/08/2007-08-11-223618.howm
....

測定結果

全部、大差ない。

find-grep(ms) dir-grep(ms) dir-each(ms)
0.441 0.400 0.400
0.473 0.326 0.309
0.415 0.312 0.289
0.525 0.382 0.298
0.362 0.326 0.290

findは遅そう。

ソースコード

#! /opt/local/bin/ruby -w
# -*- mode:ruby; coding:utf-8 -*-
#
# grep_bench.rb -
#
# Copyright(C) 2007 by mzp
# Author: MIZUNO Hiroki <hiroki1124@gmail.com> 
# http://mzp.sakura.ne.jp/
#
# Timestamp: 2007/10/25 08:53:02
#
# This program is free software; you can redistribute it and/or
# modify it under the same terms as Ruby itself.
#

# findとgrepの組合せ
def find_grep(dir,text)
  `find #{dir} -name '*.howm' | xargs grep -i -l #{text}`.split("\n")
end

# Dir.[]とgrepの組合せ
def dir_grep(dir,text)
  file_list = Dir[File.expand_path('**/*.howm',dir)]
  `grep -i -l #{text} #{file_list.join(' ')}`.split("\n")
end

# 全部自前で処理する
def dir_each(dir,text)
  file_list = Dir[File.expand_path('**/*.howm',dir)]
  file_list.select{|file|
    File.read(file) =~ /#{text}/oi
  }
end

case ARGV.shift
when '--find-grep'
  puts find_grep(ARGV[0],ARGV[1])
when '--dir-grep'
  puts dir_grep(ARGV[0],ARGV[1])
when '--dir-each'
  puts dir_each(ARGV[0],ARGV[1])
else
  raise 'error'
end