比较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 相关文章推荐
Apache设置虚拟WEB
Oct 09 PHP
PHP的explode和implode的使用说明
Jul 17 PHP
深入PHP中的HashTable结构详解
Jun 13 PHP
解析:php调用MsSQL存储过程使用内置RETVAL获取过程中的return值
Jul 03 PHP
destoon常用的安全设置概述
Jun 21 PHP
php计算title标题相似比的方法
Jul 29 PHP
yii实现model添加默认值的方法(2种方法)
Jan 06 PHP
Symfony生成二维码的方法
Feb 04 PHP
PHP随机数 C扩展随机数
May 04 PHP
PHP获取数组中单列值的方法
Jun 10 PHP
浅谈PHP接入(第三方登录)QQ登录 OAuth2.0 过程中遇到的坑
Oct 13 PHP
解决Laravel blade模板转义html标签的问题
Sep 03 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
PHP 数组排序方法总结 推荐收藏
2010/06/30 PHP
JoshChen_web格式编码UTF8-无BOM的小细节分析
2013/08/16 PHP
Laravel-添加后台模板AdminLte的实现方法
2019/10/08 PHP
jQuery使用手册之二 DOM操作
2007/03/24 Javascript
javascript全局变量封装模块实现代码
2012/11/28 Javascript
javascript模拟地球旋转效果代码实例
2013/12/02 Javascript
jQuery中操控hidden、disable等无值属性的方法
2014/01/06 Javascript
JavaScript中利用Array和Object实现Map的方法
2015/07/27 Javascript
jQuery的Ajax用户认证和注册技术实例教程(附demo源码)
2015/12/08 Javascript
JS递归遍历对象获得Value值方法技巧
2016/06/14 Javascript
ASP.NET jquery ajax传递参数的实例
2016/11/02 Javascript
微信小程序实现实时圆形进度条的方法示例
2017/02/24 Javascript
Node.JS中事件轮询(Event Loop)的解析
2017/02/25 Javascript
nodeJS实现简单网页爬虫功能的实例(分享)
2017/06/08 NodeJs
详解vue-meta如何让你更优雅的管理头部标签
2018/01/18 Javascript
JavaScript门道之标准库
2018/05/26 Javascript
vue.js 实现a标签href里添加参数
2019/11/12 Javascript
vue 检测用户上传图片宽高的方法
2020/02/06 Javascript
解决Echarts 显示隐藏后宽度高度变小的问题
2020/07/19 Javascript
Electron+vue从零开始打造一个本地播放器的方法示例
2020/10/27 Javascript
python翻译软件实现代码(使用google api完成)
2013/11/26 Python
Python import自定义模块方法
2015/02/12 Python
Windows下安装python2.7及科学计算套装
2015/03/05 Python
Python实现的寻找前5个默尼森数算法示例
2018/03/25 Python
Python日志模块logging基本用法分析
2018/08/23 Python
Python语言检测模块langid和langdetect的使用实例
2019/02/19 Python
python 监测内存和cpu的使用率实例
2019/11/28 Python
python多线程semaphore实现线程数控制的示例
2020/08/10 Python
DJI大疆无人机官方商城:全球领先的无人飞行器研发和生产商
2016/12/21 全球购物
垃圾回收的优点和原理
2014/05/16 面试题
公共事业管理本科生求职信
2013/10/07 职场文书
《灰椋鸟》教学反思
2014/04/27 职场文书
党员批评与自我批评范文
2014/09/23 职场文书
学位证书委托书
2014/09/30 职场文书
2014幼儿园教师个人工作总结
2014/11/08 职场文书
2015年端午节活动总结
2015/02/11 职场文书