--ignore-case
このオプションを追加するgrep
と、検索が 50 倍遅くなる可能性があることに非常に驚きました。これを 2 台の異なるマシンでテストしましたが、結果は同じでした。大きなパフォーマンスの違いの説明を知りたいです。
大文字と小文字を区別しない検索用の grep の代替コマンドも見たいと思います。正規表現は必要ありません。文字列検索を修正するだけです。まず、テスト ファイルはダミー データを含む 50 MB のプレーン テキスト ファイルで、次のコードを使用して生成できます。
test.txt を作成する
yes all work and no play makes Jack a dull boy | head -c 50M > test.txt
echo "Jack is no fun" >> test.txt
echo "Jack is no Fun" >> test.txt
デモンストレーション
以下は、遅さのデモンストレーションです。オプションを追加する--ignore-case
と、コマンドは 57 倍遅くなります。
$ time grep fun test.txt
all work and no plJack is no fun
real 0m0.061s
$ time grep --ignore-case fun test.txt
all work and no plJack is no fun
Jack is no Fun
real 0m3.498s
考えられる説明
ぐぐってみると、UTF-8 ロケールで grep が遅いという議論が見つかりました。そこで、次のテストを実行したところ、速度が向上しました。私のマシンのデフォルトのロケールはen_US.UTF-8
であるため、これを に設定するとPOSIX
パフォーマンスが向上したように見えますが、当然のことながら、望ましくない Unicode テキストを正しく検索できません。また、それでも 2.5 倍遅いです。
$ time LANG=POSIX grep --ignore-case fun test.txt
all work and no plJack is no fun
Jack is no Fun
real 0m0.142s
代替案
代わりに Perl を使用することもできますが、それでも大文字と小文字を区別する grep よりも 5.5 倍高速です。また、上記の POSIX grep は約 2 倍高速です。
$ time perl -ne '/fun/i && print' test.txt
all work and no plJack is no fun
Jack is no Fun
real 0m0.388s
ですから、誰かが持っている場合は、迅速で正しい代替案と説明を見つけたいと思います。
更新 - CentOS
上記でテストされた 2 台のマシンは、Ubuntu 11.04 (Natty Narwhal) と 12.04 (Precise Pangolin) を実行していました。CentOS 5.3 マシンで同じテストを実行すると、次のような興味深い結果が得られます。2 つのケースのパフォーマンス結果はほぼ同じです。現在、CentOS 5.3 は 2009 年 1 月にリリースされ、grep 2.5.1 を実行していますが、Ubuntu 12.04 は grep 2.10 を実行しています。そのため、新しいバージョンには変更があり、2 つのディストリビューションには違いがある可能性があります。
$ time grep fun test.txt
Jack is no fun
real 0m0.026s
$ time grep --ignore-case fun test.txt
Jack is no fun
Jack is no Fun
real 0m0.027s