当此选项使用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匹配;除非开发人员选择使用该库,否则我真的不应该专门讨论设计。grep
grep
我建议您将测试替换为
—
muru 17/09/29
time grep ... < /dev/null
,以免人们将实际问题与馈入数据grep
以及其他无关紧要的东西混为一谈。
[0-9]+
)