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

这次研究PHP正则效率与PHP字符串问题,很多时候我们都使用正则,当然讨论用PHP正则表达式的弊端也比较多,PHP正则表达式是不是真的很不效率,EnEnba开始上例子来看看,数据决定一切。

测试环境:XP+Apache2.2.6 +PHP5.2.17

例子很简单,就是匹配hao123.com首页的

标签内容。hao123.com的源码下载至本地文件为hao123.html。为了体现公平,从得到字符串开始 记时开始,匹配100次后结束。

以下的正则和字符串操作都能正确匹配出结果。

测试源码1:

贪婪型的正则,这个是网上最多的正则

$str = file_get_contents('hao123.html');

define('START_TIME',microtime(true));

for($n=1;$n<=100;$n++) {

preg_match('#

(.*)#is',$str,$r);

}

//echo $r[1];

echo (microtime(true) - START_TIME).'s';

?>

测试源码2:

非贪婪型的正则、这是贪婪型的优化版

$str = file_get_contents('hao123.html');

define('START_TIME',microtime(true));

for($n=1;$n<=100;$n++) {

preg_match('#

(.*?)#is',$str,$r);

}

//echo $r[1];

echo (microtime(true) - START_TIME).'s';

?>

测试源码3:

无回溯的正则,这算是此正则的最优版

$str = file_get_contents('hao123.html');

define('START_TIME',microtime(true));

for($n=1;$n<=100;$n++) {

preg_match('#

([^#is',$str,$r);

}

//echo $r[1]

echo (microtime(true) - START_TIME).'s';

?>

测试源码4:

字符串操作,对比使用正则有什么优势。

$str = file_get_contents('hao123.html');

define('START_TIME',microtime(true));

for($n=1;$n<=100;$n++) {

$start = stripos($str,'

')+7;

$length = stripos($str,'

')-$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倍,也是非常明显的。

博主结论:正则表达式的效率不一定比字符函数的效率低。但是可以肯定的是正则表达式的优化做得不好的话,其效率可以是天壤之别。所以,正则表达式是可以使用的,但一定要减少正则的回溯,优化正则表达式是必须的。

end

附件下载/演示源码:

【 regtest.rar 】 18.24KB

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值