比较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 相关文章推荐
综合图片计数器
Oct 09 PHP
PHP学习之PHP表达式
Oct 09 PHP
PHP include_path设置技巧分享
Jul 03 PHP
PHP 实现explort() 功能的详解
Jun 20 PHP
PHP mail()函数使用及配置方法
Jan 14 PHP
ThinkPHP3.1之D方法实例详解
Jun 20 PHP
php类中的各种拦截器用法分析
Nov 03 PHP
php实现SAE上使用storage上传与下载文件的方法
Jun 29 PHP
PHP面试常用算法(推荐)
Jul 22 PHP
Laravel搭建后台登录系统步骤详解
Jul 26 PHP
php微信公众号开发之秒杀
Oct 20 PHP
微信公众平台开发教程⑥ 微信开发集成类的使用图文详解
Apr 10 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
WAF的正确bypass
2017/01/05 PHP
php strftime函数获取日期时间(switch用法)
2018/05/16 PHP
jquery键盘事件使用介绍
2011/11/01 Javascript
Ext JS添加子组件的误区探讨
2013/06/28 Javascript
js关于精确计算和数值格式化以及直接引js文件
2014/01/28 Javascript
JavaScript中的单引号和双引号报错的解决方法
2014/09/01 Javascript
多种jQuery绑定事件的实现方式
2016/06/13 Javascript
Bootstrap Metronic完全响应式管理模板学习笔记
2016/07/08 Javascript
纯js和css完成贪吃蛇小游戏demo
2016/09/01 Javascript
jQuery页面弹出框实现文件上传
2017/02/09 Javascript
JavaScript实现的超简单计算器功能示例
2017/12/23 Javascript
JavaScript 日期时间选择器一些小结
2018/04/02 Javascript
jQuery创建及操作xml格式数据示例
2018/05/26 jQuery
利用Dectorator分模块存储Vuex状态的实现
2019/02/05 Javascript
mpvue+vant app搭建微信小程序的方法步骤
2019/02/11 Javascript
微信小程序添加插屏广告并设置显示频率(一天一次)
2019/12/06 Javascript
node.js中 mysql 增删改查操作及async,await处理实例分析
2020/02/11 Javascript
python搜索指定目录的方法
2015/04/29 Python
浅谈Python 的枚举 Enum
2017/06/12 Python
Python将多个excel表格合并为一个表格
2021/02/22 Python
Python实现简易版的Web服务器(推荐)
2018/01/29 Python
在Pycharm中调试Django项目程序的操作方法
2019/07/17 Python
Django基础知识 web框架的本质详解
2019/07/18 Python
解决python中import文件夹下面py文件报错问题
2020/06/01 Python
西班牙床垫网上商店:Colchones.es
2018/05/06 全球购物
一套带网友答案的.NET笔试题
2016/12/06 面试题
工作自我评价分享
2013/12/01 职场文书
迟到检讨书400字
2014/01/13 职场文书
校园安全广播稿
2014/02/08 职场文书
应届生自荐信范文
2014/02/21 职场文书
学生个人自我鉴定范文
2014/03/28 职场文书
让生命充满爱演讲稿
2014/05/10 职场文书
运动员口号
2014/06/09 职场文书
2014年酒店服务员工作总结
2014/12/08 职场文书
看雷锋电影观后感
2015/06/10 职场文书
如何使用PostgreSQL进行中文全文检索
2021/05/27 PostgreSQL