比较strtr, str_replace和preg_replace三个函数的效率


Posted in PHP onJune 26, 2013

之前已经分析过strtr的源码了,现在就比较strtr, str_replace和preg_replace的效率:

$str = 
'111111110000000000000000000000000000000111000001000100010000010010000010010000010100000010
'; 
$str = str_repeat($str, 1); 
$pattern1 = array('12345'=>'', '67891'=>''); 
$pattern2 = array('a'=>'', '1234567890'=>''); 
$pattern3 = '/12345|67891/'; 
$pattern4 = '/a|1234567890/'; 
$pattern5 = array('12345', '67891'); 
$pattern6 = array('a', '1234567890');  
$t = microtime(true); 
for($i=0; $i<10000; $i++) 
{
     strtr($str, $pattern1); 
} 
echo microtime(true)-$t, "/n";        //0.21915886878967   0.47268319129944  
$t = microtime(true); 
for($i=0; $i<10000; $i++) 
{
     strtr($str, $pattern2); 
} 
echo microtime(true)-$t, "/n";        //0.4768660068512    2.7257590293884   
$t = microtime(true); 
for($i=0; $i<10000; $i++) 
{
     preg_replace($pattern3, '', $str); 
} 
echo microtime(true)-$t, "/n";        //0.30504012107849    1.0864448547363  
$t = microtime(true); 
for($i=0; $i<10000; $i++) 
{
     preg_replace($pattern4, '', $str); 
} 
echo microtime(true)-$t, "/n";        //0.30298089981079    1.117014169693   
$t = microtime(true); 
for($i=0; $i<10000; $i++) 
{
     str_replace($pattern5, '', $str); 
} 
echo microtime(true)-$t, "/n";        //0.18029189109802    0.22510504722595  
$t = microtime(true); 
for($i=0; $i<10000; $i++) 
{
     str_replace($pattern6, '', $str); 
} 
echo microtime(true)-$t, "/n";        //0.18104100227356   0.23055601119995  
//说明:当str_repeat的第二个参数为1时输出第一个数字,当为8时输出第二个数字

从输出结果来看,str_replace的整体表现相对strtr和preg_replace要好的。原因从查看str_replace的源码(http://code.google.com/p/cyy0523xc/source/browse/trunk/php/str_replace%E6%BA%90%E7%A0%81.c)就可以看出,str_replace(array search, string|array replace, string subject)在执行的时候会对search的每一个元素按照先后顺序进行循环(不是按照下标或者其他的什么顺序,这个和数组在底层的实现有关),然后到subject中去匹配,如果找到就替换为相应的replace。这样从效率上的确会比strtr好,因为还会多一个从下标的最大长度到最小长度的循环,如果这时下标字符串的长度变化比较大的话,且subject字符串比较长的话,这里的开销也是比较大的。不过str_replace这样的实现也有个我们需要注意的地方,就是它不会像strtr那样最大匹配优先。例如:
 
 str_replace(array('ab', 'abc'), '1', 'abcd');
 

如果使用的是strtr,我们输出的结果会是“1d”,因为strtr会实现最大匹配。但是str_replace却会输出“1cd”,因为在search字符串中‘ab'排在“abc”的前面,所以会先把‘ab'替换成了‘1'。

现在小结一下这三个函数的用法:
str_replace:
这个应该作为字符串替换的首选方法,不过有一点需要注意,就是把最希望匹配的元素放在前面。(为了效率的提升,有时这样做也是值得的)

strtr: strtr在短字符串替换的时候也是挺高效的,不过search数组的下标长度的差别也对效率产生比较大的影响,还有就是没事最好不要使用strtr(string, string, string)这种形式(对于非单字节字符很容易产生乱码)。

preg_replace:这个不用说,可以使用正则匹配,功能绝对是最强的,不过也是要牺牲一点效率的。

PHP 相关文章推荐
array_multisort实现PHP多维数组排序示例讲解
Jan 04 PHP
php切割页面div内容的实现代码分享
Jul 31 PHP
phpexcel导出excel的颜色和网页中的颜色显示不一致
Dec 11 PHP
php分页函数示例代码分享
Feb 24 PHP
PHP浮点数精度问题汇总
May 13 PHP
分享php代码将360浏览器导出的favdb的sqlite数据库文件转换为html
Dec 09 PHP
php数组指针操作详解
Feb 14 PHP
php框架CodeIgniter主从数据库配置方法分析
May 25 PHP
PHP5.0 TIDY_PARSE_FILE缓冲区溢出漏洞的解决方案
Oct 14 PHP
PHP赋值的内部是如何跑的详解
Jan 13 PHP
Smarty模板变量与调节器实例详解
Jul 20 PHP
PHP使用openssl扩展实现加解密方法示例
Feb 20 PHP
解析php扩展php_curl.dll不加载的解决方法
Jun 26 #PHP
php ci框架验证码实例分析
Jun 26 #PHP
解析php file_exists无效的解决办法
Jun 26 #PHP
使用HMAC-SHA1签名方法详解
Jun 26 #PHP
php读取文件内容的几种方法详解
Jun 26 #PHP
深入file_get_contents与curl函数的详解
Jun 25 #PHP
解析如何去掉CodeIgniter URL中的index.php
Jun 25 #PHP
You might like
第1次亲密接触PHP5(1)
2006/10/09 PHP
PHP编程之高级技巧——利用Mysql函数
2006/10/09 PHP
利用static实现表格的颜色隔行显示的代码
2007/09/02 PHP
PHP实现获取FLV文件的时间
2015/02/10 PHP
php的debug相关函数用法示例
2016/07/11 PHP
Google 静态地图API实现代码
2010/11/19 Javascript
JavaScript获取/更改文本框的值的实例代码
2013/08/02 Javascript
javascript 函数声明与函数表达式的区别介绍
2013/10/05 Javascript
编写高效jQuery代码的4个原则和5个技巧
2014/04/24 Javascript
javascript学习笔记(四)function函数部分
2014/09/30 Javascript
js实现简单计算器
2015/11/22 Javascript
js父页面中使用子页面的方法
2016/01/09 Javascript
JS返回只包含数字类型的数组实例分析
2016/12/16 Javascript
详谈DOM简介及节点、属性、查找节点的方法
2017/11/16 Javascript
JS同步、异步、延迟加载的方法
2018/05/05 Javascript
angular2/ionic2 实现搜索结果中的搜索关键字高亮的示例
2018/08/17 Javascript
Vue.set() this.$set()引发的视图更新思考及注意事项
2018/08/30 Javascript
微信小程序实现基于三元运算验证手机号/姓名功能示例
2019/01/19 Javascript
JavaScript数据结构与算法之检索算法示例【二分查找法、计算重复次数】
2019/02/22 Javascript
利用js-cookie实现前端设置缓存数据定时失效
2019/06/18 Javascript
js实现倒计时秒杀效果
2020/03/25 Javascript
[02:52]2017DOTA2国际邀请赛中国区预选赛晋级之路
2017/07/03 DOTA
举例讲解Python中的死锁、可重入锁和互斥锁
2015/11/05 Python
详解python实现线程安全的单例模式
2018/03/05 Python
在python中用url_for构造URL的方法
2019/07/25 Python
关于pycharm中pip版本10.0无法使用的解决办法
2019/10/10 Python
python数据预处理 :数据共线性处理详解
2020/02/24 Python
在pycharm中debug 实时查看数据操作(交互式)
2020/06/09 Python
使用keras实现BiLSTM+CNN+CRF文字标记NER
2020/06/29 Python
Python暴力破解Mysql数据的示例
2020/11/09 Python
实现strstr功能,即在父串中寻找子串首次出现的位置
2016/08/05 面试题
学生上课看漫画的检讨书
2014/09/26 职场文书
党员个人整改措施
2014/10/24 职场文书
党的群众路线教育实践活动个人整改措施材料
2014/11/04 职场文书
2015年档案室工作总结
2015/05/23 职场文书
北京青年观后感
2015/06/15 职场文书