ときgrepやsedオプションとともに使用され--extended-regexp、パターンが{1,9999}使用されている正規表現の一部であり、これらのコマンドの性能が低くなります。より明確にするために、以下はいくつかのテストに適用されます。[1] [2]
- 相対性能
grep -E、egrepおよびsed -E、で作られたので、唯一のテストはほぼ等しいgrep -Eが設けられています。
テスト1
$ time grep -E '[0-9]{1,99}' < /dev/null
real 0m0.002s
テスト2
$ time grep -E '[0-9]{1,9999}' < /dev/null
> real 0m0.494s
テスト3
$ time grep -E '[0123456789] {1,9999}' </ dev / null
>リアル21分43.947秒
テスト4
$ time grep -E '[0123456789]+' < /dev/null
$ time grep -E '[0123456789]*' < /dev/null
$ time grep -E '[0123456789]{1,}' < /dev/null
$ time grep -P '[0123456789]{1,9999}' < /dev/null
real 0m0.002s
このパフォーマンスの大きな違いの理由は何ですか?
入力は関係ありません。@steeldriverが示唆するように、スローダウンはマッチングに先行します。より単純なテストは
—
Eliah Kagan
time grep -E '[0-9]{1,99}' </dev/nullvs time grep -E '[0-9]{1,9999}' </dev/nullです。入力がない場合でも、2番目のコマンドは遅くなります(16.04)。予想されるように、省略-E及びエスケープ{と}同様に振る舞い、置換-Eとする-P(PCREが異なるエンジンである)低速ではありません。最も興味深いのはどのくらいです速く [0-9]よりもある.、xとさえ[0123456789]。これらのいずれかとして{1,9999}、grepRAMの膨大な量を消費し、あえて10分以上実行させませんでした。
@αғsнιηいいえ、
—
Eliah Kagan
{ }されて' '引用されました。シェルはそれらを変更せずにに渡しますgrep。とにかく、{1,9999}非常に高速でシンプルなブレース展開になります。シェルはそれをに拡張し1 9999ます。
@αғsнιηどういう意味かわかりませんが、これは間違いなくシェルとは関係ありません。長時間実行コマンドの間に、私が使用
—
Eliah Kagan
psしてtop検証するためにgrep期待される引数が渡され、それが、ないことをbash、RAMとCPUの多くを消費します。私は期待してgrepおり、sed両方ともBRE / EREマッチングのためにlibcに実装されたPOSIX regex関数を使用しています。開発者がそのライブラリを使用することを選択した場合を除いて、デザインについて具体的に話す必要はありませんでした。grepgrep
テストを
—
muru、2017
time grep ... < /dev/nullに置き換えることをお勧めします。これにより、実際の問題が、フィードされたデータgrepやその他の無関係なものと混同されなくなります。
[0-9]+)