我试图测试正则表达式的捕获和非捕获组的性能。 顺便说一下,捕获组和非捕获组之间存在非常小的差异。 这个结果是否正常?
[root@Sensor ~]# ll -h sample.log
-rw-r--r-- 1 root root 21M Oct 20 23:01 sample.log
[root@Sensor ~]# time grep -ciP '(get|post).*' sample.log
20000
real 0m0.083s
user 0m0.070s
sys 0m0.010s
[root@Sensor ~]# time grep -ciP '(?:get|post).*' sample.log
20000
real 0m0.083s
user 0m0.077s
sys 0m0.004s
答案 0 :(得分:3)
通常,非捕获组的性能优于捕获组,因为它们需要较少的内存分配,并且不会复制组匹配。但是,有三个重要的警告:
grep
这样的程序的行为需要大量的时间和记忆,并且可能会超过使用非捕获组所获得的任何小改进。答案 1 :(得分:1)
如果使用了很多捕获组。 差异似乎更多。
谢谢大家。:)
[root@Sensor ~]# time grep -ciP "(get|post)\s[^\s]+" sample.log
20000
real 0m0.057s
user 0m0.051s
sys 0m0.005s
[root@Sensor ~]# time grep -ciP "(?:get|post)\s[^\s]+" sample.log
20000
real 0m0.061s
user 0m0.053s
sys 0m0.006s
[root@Sensor ~]# time grep -ciP "(get|post)\s[^\s]+(get|post)" sample.log
1880
real 0m0.839s
user 0m0.833s
sys 0m0.005s
[root@Sensor ~]# time grep -ciP "(?:get|post)\s[^\s]+(?:get|post)" sample.log
1880
real 0m0.744s
user 0m0.741s
sys 0m0.003s