[英]About regexp performancing
给定字符串ab
鉴于这种正则表达式模式
(a)(b)
如果我们需要删除完整的字符串,但打印第二组,我们可以编写2个变体:
1) preg_replace("#(a)(b)#", "$2", "ab") // save both group
还有:
2) preg_replace("#(?:a)(b)#", "$1", "ab") // dont save first group
哪种变体更适合性能?
哪种变体更适合性能?
无论是。
如果你只需要做几次替换,那就没关系了。 如果您必须进行数百万次替换,则必须考虑源数据的另一种格式,这将需要较少的解析。
但无论如何,现在电脑很快。 我的意思是快。
足够快以运行基于JSON或XML的应用程序,而JSON或XML解析需要比简单的正则表达式更多的资源。 他们运行良好。 所以,我怀疑你会遇到这样一个状态,这样的正则表达式会影响任何事情
我以紧凑的循环运行每个操作5,000,000,并比较时间。 我实际比较了四个操作:
preg_replace("#(a)(b)#", "$2", "ab");
preg_replace("#(?:a)(b)#", "$2", "ab");
preg_replace("#a(b)#", "$2", "ab");
preg_replace("#a(?=b)#", "", "ab");
我没有看到时间上的非常一致的差异,所以我认为它实际上对性能无关紧要,即我会从设计/语义角度选择最合理的。
#1和#2表现差不多。 #2似乎稍快,但偶尔会慢一点(可能是由于服务器噪音)。 #3始终比这快5%左右,选项#4比#3快2%左右(即它似乎是最好的,可能是因为它不必捕获或插入任何东西)。
不过,我只是选择最有意义的东西。
我意识到str_replace("ab", "b", "ab");
可能不是类似的,但如果可以,请使用它。 它的速度始终是其他任何速度的两倍多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.