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