strtr和str_replace效率探索

今天写代码用到字符串规制,就上网查了下strtr与str_replace的效率如何,网上一些地方说strtr比str_replace快四倍。半信半疑,自己就做了下测试。

strtr比较怪异,用法这里不提。只做两种这两个函数可以替换用的测试例子。

第一种

list( $usec, $sec ) = explode(' ', microtime() );
$star = $usec+$sec;
$string = 'paocaiasdfsadfasdfasdfasdfasdfasdfasdfasdfasdfpaocaiasdfsadfasdfasdfasdfasdfasdfasdfasdfasdfpaocaiasdfsadfasdfasdfasdfasdfasdfas!';
$aa = array('pao'=>'a');
for($i=1; $i<= 10000; $i++ ){
 $sssss = strtr( $string, $aa ); 
}
list( $usec, $sec ) = explode(' ', microtime() );
$end = $usec+$sec;
echo 'strtr用时:'.($end-$star);
echo "<br>";

list( $usec, $sec ) = explode(' ', microtime() );
$star = $usec+$sec;
for($i=1; $i<= 10000; $i++ ){
 $sssss = str_replace('pao', 'a', $string ); 
}
list( $usec, $sec ) = explode(' ', microtime() );
$end = $usec+$sec;
echo 'str_replace用时:'.($end-$star);
echo "<br>";
exit;
结果如下:

strtr用时:0.10797691345215

str_replace用时:0.020326137542725


第二种

$string = 'absdfddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd';

list( $usec, $sec ) = explode(' ', microtime() );
$star = $usec+$sec;
for($i=1; $i<= 100000; $i++ ){
 $sssss = strtr( $string, 'ab', '01');
}
list( $usec, $sec ) = explode(' ', microtime() );
$end = $usec+$sec;
echo 'strtr用时:'.($end-$star);
echo "<br>";

list( $usec, $sec ) = explode(' ', microtime() );
$star = $usec+$sec;
for($i=1; $i<= 100000; $i++ ){
 $sssss = str_replace( 'ab', '01', $string);
}
list( $usec, $sec ) = explode(' ', microtime() );
$end = $usec+$sec;
echo 'str_replace用时:'.($end-$star);
echo "<br>";
exit;

结果如下:

strtr用时:0.20317006111145
str_replace用时:0.14615988731384


以上两个测试用时,随着$string变大和for循环变大,strtr用时会比str_replace用时越来越多,for循环达到百万级时,strtr用时是str_replace用时的四倍,无语了。


以下是strtr源码,可能strtr在其他使用例子上是比较快,但是不能和str_replace做比较。

/* {{{ php_strtr
 */
PHPAPI char *php_strtr(char *str, int len, char *str_from, char *str_to, int trlen)
{
    int i;
    unsigned char xlat[256];
 
    if ((trlen < 1) || (len < 1)) {
        return str;
    }
 
    for (i = 0; i < 256; xlat[i] = i, i++);
 
    for (i = 0; i < trlen; i++) {
        xlat[(unsigned char) str_from[i]] = str_to[i];
    }
 
    for (i = 0; i < len; i++) {
        str[i] = xlat[(unsigned char) str[i]];
    }
 
    return str;
}
/* }}} */




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hello_simon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值