[解決済み] どうしてgrepはそんなに速く動くのですか?
質問
以前はJavaのsubstringメソッドを使っていましたが、今はGREPを使って数秒で実行され、以前書いたJavaのコードよりも驚くほど速いです。
とはいえ、どうしてそうなっているのかがわからないのですが、ウェブ上でもあまり公開されていないようです。
どなたか助けていただけませんか?
どのように解決するのですか?
あなたの質問が
GNU grep
具体的には 以下は作者 Mike Haertel からのメモです。
GNU grepが速いのは、入力バイトのすべてを見ることを避けるためです。
GNU grepが高速なのは、入力された各バイトに対してごくわずかな命令しか実行しないからです。 入力された各バイトに対して するためです。 を見ることができます。
GNU grepはよく知られたBoyer-Mooreアルゴリズムを使用しています。 を探し、ルックアップテーブルを使い ルックアップテーブルを使用して、マッチしない文字を見つけるたびに、入力のどの程度先まで読み飛ばすことができるかを教えてくれます。 ルックアップテーブルを使用して、一致しない文字が見つかったときに、入力のどの程度先までスキップできるかを知らせます。
GNU grep はまた、Boyer-Moore の内部ループを展開し、Boyer-Moore の差分テーブルのエントリをセットアップします。 Boyer-Moore デルタテーブルのエントリを設定します。 ループの終了テストを行う必要がないように設定します。 この結果 GNU grepが実際に実行する入力バイトごとのx86命令数は平均して3つ以下です。 その結果、GNU grepは実際に見る各入力バイトに対して実行されるx86命令の平均が3以下となります(そして多くのバイトを完全にスキップします)。 バイトを完全にスキップします)。
GNU grep は生の Unix 入力システムコールを使用し、読み込んだ後のデータのコピーを回避します。 しません。さらに、GNU grepは入力を行単位に分割することを避けています。 行に分割することを避けます。 改行を探すと grep の速度が数倍遅くなります。 なぜなら、改行を見つけるためには、すべてのバイトを見なければならないからです。 なぜなら、改行を見つけるために、すべてのバイトを見なければならないからです!
そのため、行指向の入力を使用する代わりに、GNU grep は生のデータを大きなバッファに読み込みます。 大きなバッファに読み込み、Boyer-Moore を使ってバッファを検索し、一致するものを見つけたときだけ 一致した場合のみ、境界の改行を探しに行きます。 (ある種のコマンドラインオプション、例えば -n のような特定のコマンド ライン オプションはこの最適化を無効にします)。
この回答は、以下の情報のサブセットです。 ここで .
関連
-
[解決済み] Linuxで特定のテキストを含むすべてのファイルを検索するにはどうすればよいですか?
-
[解決済み] Bashシェルスクリプトでディレクトリが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] ファイルを grep して、その周辺の行をいくつか表示する?
-
[解決済み] シェルで、「2>&1」はどういう意味ですか?
-
[解決済み] すべてのディレクトリとサブディレクトリを再帰的にgrepするにはどうしたらいいですか?
-
[解決済み] Gitの履歴からコミットしたコードをgrep(検索)する方法
-
[解決済み] Linux で grep を使ってファイル名だけを表示するにはどうしたらいいですか?
-
[解決済み] grep -R からディレクトリを除外するにはどうすればよいですか?
-
[解決済み】特定の拡張子を持つファイルのみを再帰的にgrepするにはどうすればよいですか?
-
[解決済み] 異なる行のファイル名のリストを取得する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] dev/ttyは何が特別なのですか?[クローズド]
-
[解決済み] すべてのディレクトリとサブディレクトリを再帰的にgrepするにはどうしたらいいですか?
-
[解決済み] 新しい鍵を作成せずに、SSH鍵のパスフレーズを削除するにはどうすればよいですか?
-
[解決済み] 全ユーザーのcronジョブを一覧表示する方法を教えてください。
-
[解決済み] less' で行番号を表示する方法 (GNU)
-
[解決済み] PowerShellはWindowsのCygwinシェルを置き換える準備ができていますか?[クローズド]
-
[解決済み】Crontab - ディレクトリで実行する
-
[解決済み] 標準入力にタイムスタンプを前置するUnixユーティリティはありますか?
-
[解決済み] コマンドライン:検索結果をrmにパイプする
-
[解決済み] findコマンドでファイルサイズをファイル名と一緒に出力するにはどうしたらいいですか?