PHP正则效率与PHP字符串效率比拟 测试例子(1)

     这次研究PHP正则效率与PHP字符串问题,许多时候我们都利用正则,虽然接头用PHP正则表达式的漏洞也较量多,PHP正则表达式是不是真的很不效率,EnEnba开始上例子来看看,数据抉择一切。

测试情况:XP+Apache2.2.6 +PHP5.2.17

 

    例子很简朴,就是匹配hao123.com首页的<title>标签内容。hao123.com的源码下载至当地文件为hao123.html。为了浮现公正,从获得字符串开始 记时开始,匹配100次后竣事。

以下的正则和字符串操纵都能正确匹配出功效。

测试源码1:
贪婪型的正则,这个是网上最多的正则

<?php $str = file_get_contents('hao123.html'); define('START_TIME',microtime(true)); for($n=1;$n<=100;$n++) { preg_match('#<title>(.*)</title>#is',$str,$r); } //echo $r[1]; echo (microtime(true) - START_TIME).'s'; ?>

测试源码2:
非贪婪型的正则、这是贪婪型的优化版

<?php $str = file_get_contents('hao123.html'); define('START_TIME',microtime(true)); for($n=1;$n<=100;$n++) { preg_match('#<title>(.*?)</title>#is',$str,$r); } //echo $r[1]; echo (microtime(true) - START_TIME).'s'; ?>

测试源码3:
无回溯的正则,这算是此正则的最优版

<?php $str = file_get_contents('hao123.html'); define('START_TIME',microtime(true)); for($n=1;$n<=100;$n++) { preg_match('#<title>([^<]*)</title>#is',$str,$r); } //echo $r[1] echo (microtime(true) - START_TIME).'s'; ?>

测试源码4:
字符串操纵,比拟利用正则有什么优势。 

<?php $str = file_get_contents('hao123.html'); define('START_TIME',microtime(true)); for($n=1;$n<=100;$n++) { $start = stripos($str,'<title>')+7; $length = stripos($str,'</title>')-$start; $r = substr($str,$start,$length); } //echo $r; echo (microtime(true) - START_TIME).'s'; ?>

100次轮回用时功效:

一、测试源码1:贪婪型的正则
用时:
 1.84824609756s
 1.81924510002s
 1.83465003967s
 1.82647705078s
 1.83154320717s
 1.81038379669s
 1.80642414093s
 1.81480193138s
 1.81055712700s
 1.82441902161s

二、测试源码2:非贪婪型的正则
 0.00148916244507s
 0.00124597549438s
 0.00130200386047s
 0.00129199028015s
 0.00134801864624s
 0.00129318237305s
 0.00124812126160s
 0.00129103660583s
 0.00125002861023s
 0.00144720077515s
 0.00070405006408s

三、测试源码3:无回溯的正则
 0.000961065292358s
 0.000746965408325s
 0.000747203826904s
 0.000746011734009s
 0.000751018524170s
 0.000831127166748s
 0.000749111175537s
 0.000746011734009s
 0.000929832458496s
 0.000748157501221s
 0.000812053680420s

四、测试源码4:字符串操纵
 0.561131954193s
 0.558562994003s
 0.554402112961s
 0.558073997498s
 0.558518171310s
 0.560245990753s
 0.557929992676s
 0.559715986252s
 0.560138940811s
 0.556318998337s
 0.558421134949s

10次功效平均用时:(时间越短效率越高)
一、测试源码1:贪婪型的正则
1.82267475128s

二、测试源码2:非贪婪型的正则
0.00139107704s

三、测试源码3:无回溯的正则
0.00087685585s 

四、测试源码4:字符串操纵
0.56434602737s

此例子功效
效率:无回溯的正则 > 非贪婪型的正则 > 字符串操纵 > 贪婪型的正则

与字符串操纵的效率倍数
贪婪型的正则0.33倍  非贪婪型的正则400倍  无回溯的正则700

最好最坏后果相差2000倍!!!!

     以后例子的功效可以看出,正则的效率是东倒西歪。回溯较多的贪婪型的正则表达式,效率很是低,低于字符串操纵,字符串操纵上看,却远远低于非贪婪和无回溯的正则,已经不是一个数量级。无回溯的正则长短贪婪型的正则的1.75倍,也长短常明明的。

博主结论:正则表达式的效率不必然比字符函数的效率低。可是可以必定的是正则表达式的优化做得欠好的话,其效率可以是天壤之别。所以,正则表达式是可以利用的,但必然要淘汰正则的回溯,优化正则表达式是必需的。

enenba.com 原创正则文章,转载请注明出处 ?post=143 

end

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/7890.html