--ignore-case
オプションをgrep
に追加すると、検索が50倍遅くなる可能性があることに非常に驚きました。私は同じ結果を持つ2つの異なるマシンでこれをテストしました。私は、巨大なパフォーマンスの違いについての説明を見つけるのが好奇心です。"grep --ignore-case"が50倍遅いのはなぜですか?
大文字と小文字を区別しない検索のためのgrepの代替コマンドも見たいと思います。正規表現は必要ありません。固定文字列検索だけです。最初のテストファイルは、いくつかのダミーデータで50 メガバイトプレーンテキストファイルになります、あなたはそれを生成するために、次のコードを使用することがあります。
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
代替
我々は、それが5.5倍速く大文字と小文字の区別はgrepその後、まだ高速ですが、代わりにPerlを使用することができます。上記の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
誰かがいる場合は、速い正しい代替案と説明を見つけたいと思います。
UPDATE - CentOSの
両方の上に試験した2台のマシンがUbuntuの1 11.04(ナッティイッカク)、その他12.04(精密センザンコウ)を実行しました。 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
あなたは要約を提供することができますか? –