見出し画像

grepよりfind+xargsの方が速い

■ プログラムにとって速さは正義だ。


プログラムは命令を実行するツールでありアートではないため、機能性が高く評価される。
例えば大量のファイルを対象に検索を行う際にコンマ1秒でも速く終わればどれほど嬉しいことか。それが100回も1000回も繰り返す使われるようなプログラムならなおのことだ。

先日、知人からgrep より find + xargsの方が速いとの話を伺ったので今日はその検証を行う。

まず手元に2500万文字のファイルを5つ用意した。この中に「test」という文字がいくつか含まれている。このファイルを5つ複製し、これらを検索する実行速度を評価する。


ファイルの文字数。このファイルが5つあり、その中から特定語を検索する。


textfile1.txt

$ cat milchars.txt| wc -m
26116283



■ 測定方法


mac(linux)でコマンドの実行速度を測る際は「time」コマンドを利用するのが一般的である。
余談だが私はこの前までtimeコマンドの存在を知らずに毎回測定用のプログラムを自作していた。
ちなみにたtimeコマンドの表示の意味は次の通りである。

表示 意味

real %e そのコマンドを実行するのにかかった時間
user %U そのコマンドを実行するのに使用したユーザーCPU時間
sys %S そのコマンドを実行するのに使用したシステムCPU時間


■ grepの場合

それでは計測する
実行コマンド

grep test dir

実行結果

$ time grep -r "test" files
grep --color=auto -r "test" files  1.98s user 0.03s system 99% cpu 2.023 total

→結果: 1.98s


■ xargsの場合


time find ./ -type f | xargs grep -r "word"

実行結果

$ time find ./ -type f | xargs grep -r test
xargs grep -r test  1.71s user 0.03s system 99% cpu 1.745 total

→結果: 1.71s


■ 比較


知人の言う通りfind + xargs の方がgrepより1.15倍ほど速い。
ことからxargs の方がgrep より速いことが証明できた。

■ まとめ


アルゴリズムの最適化とは見方次第で評価が変化するが、今回の検証ではfind + xargs の方に軍配が上がった。
プログラムにおける速度とはすなわち正義に直結する。速いプログラムがいつも採用されるわけではないが、遅いプログラムはいつも採用されない。これは真理である。

この記事が気に入ったらサポートをしてみませんか?