Regex 捕获组与非捕获组

Regex 捕获组与非捕获组,regex,Regex,我试图测试正则表达式的捕获组和非捕获组的性能。 顺便说一下,捕获组和非捕获组之间的差别非常小。 这个结果正常吗 [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 0

我试图测试正则表达式的捕获组和非捕获组的性能。 顺便说一下,捕获组和非捕获组之间的差别非常小。 这个结果正常吗

[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

通常,非捕获组的性能优于捕获组,因为它们需要更少的内存分配,并且不会使组的副本匹配。但是,有三个重要的注意事项:

  • 对于具有短匹配的简单、短表达式,差异通常非常小
  • 启动像
    grep
    这样的程序本身需要大量的时间和内存,并且可能会压倒使用非捕获组所获得的任何小的改进
  • 有些语言以相同的方式实现捕获组和非捕获组,这导致后者无法提高性能

如果使用大量的捕获组。 差别似乎更大

谢谢大家。:)


由于缓冲区中未保存任何文本,因此非捕获组比捕获组花费的时间稍短。如果您希望节省时间,请删除
*
,因为它将始终匹配,并且您不会捕获它。因为您提到了二进制文件的加载时间,您可能想提到,与CPU速度相比,文件I/O速度相当慢。希望在调用
grep
期间,整个文件
sample.log
都在操作系统的I/O缓存中。
[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