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 "
"; 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 "
"; 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 "
"; 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 "
"; 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;
}
/* }}} */




你可能感兴趣的:(php)