とき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/null
vs time grep -E '[0-9]{1,9999}' </dev/null
です。入力がない場合でも、2番目のコマンドは遅くなります(16.04)。予想されるように、省略-E
及びエスケープ{
と}
同様に振る舞い、置換-E
とする-P
(PCREが異なるエンジンである)低速ではありません。最も興味深いのはどのくらいです速く [0-9]
よりもある.
、x
とさえ[0123456789]
。これらのいずれかとして{1,9999}
、grep
RAMの膨大な量を消費し、あえて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関数を使用しています。開発者がそのライブラリを使用することを選択した場合を除いて、デザインについて具体的に話す必要はありませんでした。grep
grep
テストを
—
muru、2017
time grep ... < /dev/null
に置き換えることをお勧めします。これにより、実際の問題が、フィードされたデータgrep
やその他の無関係なものと混同されなくなります。
[0-9]+
)