当此选项使用grep或且模式是所使用的regexp的一部分时,这些命令的性能会降低。为了更加清楚,下面应用了一些测试。[1] [2]sed--extended-regexp{1,9999}
- 的相对性能
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
>真实的21m43.947s
测试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建议的那样,减速先于匹配。一个简单的测试是
—
伊莱亚·卡根
time grep -E '[0-9]{1,99}' </dev/null对time grep -E '[0-9]{1,9999}' </dev/null。即使没有输入,第二个命令仍然很慢(在16.04上)。正如预期的那样,省略-E和逸出{和}行为相同和更换-E用-P不慢(PCRE是一个不同的发动机)。最有趣的是,速度 [0-9]比.,x甚至还要快多少[0123456789]。对于任何那些和{1,9999},grep消耗巨大的内存大小; 我还不敢让它运行超过10分钟。
@αғsнιη我不太清楚您的意思,但这绝对与外壳无关。在长时间运行的命令中,我使用
—
伊莱亚·卡根
ps并top验证是否grep传递了预期的参数,并且该参数(而不是bash)消耗了大量的RAM和CPU。我期望grep并且sed都使用libc中实现的POSIX regex函数进行BRE / ERE匹配;除非开发人员选择使用该库,否则我真的不应该专门讨论设计。grepgrep
我建议您将测试替换为
—
muru 17/09/29
time grep ... < /dev/null,以免人们将实际问题与馈入数据grep以及其他无关紧要的东西混为一谈。
[0-9]+)