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