strtr和str_replace效率探索

来源:互联网 发布:手持式网络测试仪 编辑:程序博客网 时间:2024/06/08 09:02

今天写代码用到字符串规制,就上网查了下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 0