比较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 相关文章推荐
用IE远程创建Mysql数据库的简易程序
Oct 09 PHP
PHP中根据IP地址判断城市实现城市切换或跳转代码
Sep 04 PHP
深入php常用函数的使用汇总
Jun 08 PHP
php写的AES加密解密类分享
Jun 20 PHP
php生成年月日下载列表的方法
Apr 24 PHP
PHP中PDO连接数据库中各种DNS设置方法小结
May 13 PHP
PHP封装的多文件上传类实例与用法详解
Feb 07 PHP
php使用 readfile() 函数设置文件大小大小的方法
Aug 11 PHP
yii2.0整合阿里云oss上传单个文件的示例
Sep 19 PHP
PHP输出Excel PHPExcel的方法
Jul 26 PHP
PHP PDOStatement::debugDumpParams讲解
Jan 30 PHP
PHP开发实现快递查询功能详解
Apr 08 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
真正面向对象编程:PHP5.01发布
2006/10/09 PHP
解析php中call_user_func_array的作用
2013/06/07 PHP
hadoop常见错误以及处理方法详解
2013/06/19 PHP
PHP文件去掉PHP注释空格的函数分析(PHP代码压缩)
2013/07/02 PHP
Zend Framework框架Smarty扩展实现方法
2016/03/22 PHP
javascript 实现 秒杀,团购 倒计时展示的记录 分享
2013/07/12 Javascript
HTML5实现留言和回复页面样式
2015/07/22 Javascript
JavaScript中字面量与函数的基本使用知识
2015/10/20 Javascript
基于VUE选择上传图片并页面显示(图片可删除)
2017/05/25 Javascript
深入理解Webpack 中路径的配置
2017/06/17 Javascript
利用JavaScript如何查询某个值是否数组内
2017/07/30 Javascript
解决Vue 浏览器后退无法触发beforeRouteLeave的问题
2017/12/24 Javascript
node.js遍历目录的方法示例
2018/08/01 Javascript
利用JS实现一个同Excel表现的智能填充算法
2018/08/13 Javascript
如何利用vue+vue-router+elementUI实现简易通讯录
2019/05/13 Javascript
微信小程序如何实现全局重新加载
2019/06/05 Javascript
ionic+html5+API实现双击返回键退出应用
2019/09/17 Javascript
VUE实现强制渲染,强制更新
2019/10/29 Javascript
Vue基于iview实现登录密码的显示与隐藏功能
2020/03/06 Javascript
mpvue 项目初始化及实现授权登录的实现方法
2020/07/20 Javascript
vue 导航菜单刷新状态不消失,显示对应的路由界面操作
2020/08/06 Javascript
探究一道价值25k的蚂蚁金服异步串行面试题
2020/08/21 Javascript
js实现日历
2020/11/07 Javascript
[50:28]LGD女子学院第三期 DOTA2复仇之魂教学
2013/12/24 DOTA
[48:45]Ti4 循环赛第二日 NEWBEE vs EG
2014/07/11 DOTA
举例区分Python中的浅复制与深复制
2015/07/02 Python
详解windows python3.7安装numpy问题的解决方法
2018/08/13 Python
详解Numpy中的广播原则/机制
2018/09/20 Python
对python添加模块路径的三种方法总结
2018/10/16 Python
paramiko使用tail实时获取服务器的日志输出详解
2020/12/06 Python
分享一个页面平滑滚动小技巧(推荐)
2019/10/23 HTML / CSS
爱尔兰旅游网站:ebookers.ie
2020/01/24 全球购物
医院保洁服务方案
2014/06/11 职场文书
2015年主婚人婚礼致辞
2015/07/28 职场文书
领导激励员工的演讲稿,各种会上用得到,建议收藏
2019/08/13 职场文书
Netflix《海贼王》真人版剧集多张片场照曝光
2022/04/04 日漫