比较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 相关文章推荐
php字符串截取问题
Nov 28 PHP
PHP 命令行工具 shell_exec, exec, passthru, system详细使用介绍
Sep 11 PHP
php后门URL的防范
Nov 12 PHP
codeigniter上传图片不能正确识别图片类型问题解决方法
Jul 25 PHP
PHP中使用file_get_contents抓取网页中文乱码问题解决方法
Dec 17 PHP
PHP获取一年中每个星期的开始和结束日期的方法
Feb 12 PHP
PHP中使用BigMap实例
Mar 30 PHP
PHP微信红包生成代码分享
Oct 06 PHP
完美的php分页类
Oct 24 PHP
详解php中生成标准uuid(guid)的方法
Apr 28 PHP
PHP程序守护进程化实现方法详解
Jul 16 PHP
PHP实现创建以太坊钱包转账等功能
Apr 21 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
CI框架中redis缓存相关操作文件示例代码
2016/05/17 PHP
PHP 常用时间函数资料整理
2016/10/22 PHP
javascript 写类方式之三
2009/07/05 Javascript
JavaScript Cookie显示用户上次访问的时间和次数
2009/12/08 Javascript
在chrome浏览器中,防止input[text]和textarea在聚焦时出现黄色边框的解决方法
2011/05/24 Javascript
兼容IE和Firefox的javascript获取iframe文档内容的函数
2011/08/15 Javascript
JavaScript 类型的包装对象(Typed Wrappers)
2011/10/27 Javascript
jQuery实现id模糊查询的小例子
2013/03/19 Javascript
jquery事件重复绑定的快速解决方法
2014/01/03 Javascript
Jquery 获取对象的几种方式介绍
2014/01/17 Javascript
滚动条响应鼠标滑轮事件实现上下滚动的js代码
2014/06/30 Javascript
鼠标悬浮显示二级菜单效果的jquery实现
2014/10/29 Javascript
浅析Bootstrap验证控件的使用
2016/06/23 Javascript
JavaScript DOM节点操作方法总结
2016/08/23 Javascript
解决Vue编译时写在style中的路径问题
2017/09/21 Javascript
vue.js或js实现中文A-Z排序的方法
2018/03/08 Javascript
详解vue 计算属性与方法跟侦听器区别(面试考点)
2018/04/23 Javascript
如何在基于vue-cli的项目自定义打包环境
2018/11/10 Javascript
checkbox在vue中的用法小结
2018/11/13 Javascript
微信小程序getLocation 需要在app.json中声明permission字段
2020/03/03 Javascript
详解vue-flickity的fullScreen功能实现
2020/04/07 Javascript
vue中后端做Excel导出功能返回数据流前端的处理操作
2020/09/08 Javascript
[00:28]DOTA2北京网鱼队选拔赛
2015/04/08 DOTA
python解决pandas处理缺失值为空字符串的问题
2018/04/08 Python
Python框架Flask的基本数据库操作方法分析
2018/07/13 Python
NumPy 基本切片和索引的具体使用方法
2019/04/24 Python
python如何将两张图片生成为全景图片
2020/03/05 Python
浅谈python 类方法/静态方法
2020/09/18 Python
英国排名第一的LED灯泡网站:LED Bulbs
2019/09/03 全球购物
薇姿法国官网:Vichy法国
2021/01/28 全球购物
数据库方面面试题
2012/04/22 面试题
大学生水文观测实习自我鉴定
2013/09/29 职场文书
高等学院职业生涯规划书范文
2014/09/16 职场文书
授权委托书范本(单位)
2014/09/28 职场文书
上课说话检讨书500字
2014/11/01 职场文书
员工2014年度工作总结
2014/12/09 职场文书