PHP里strtr()为什么会比str_replace()快四倍
它们的替换功能是如何实现的?什么算法?
麻烦哪位大牛,帮忙详解一下!

解决方案 »

  1.   

    具体要分析源码,我猜跟替换字串固定长度有关,而且手册上说的是产生“副本”,这个还没理解str_replace是不固定长度的,所以搜索自然要慢很多
      

  2.   

    str_replace灵活性比strtr大很多,strtr只能接受字符和数组格式,正则的不行。功能差异内核部分,str_replace要计算的过程肯定比strtr要多,具体源码不知道上哪找了。
      

  3.   

    http://topic.csdn.net/u/20110502/17/ef45f76a-0cb8-4571-aff4-ab4ec25f59fc.html?29604
      

  4.   

    我好像总是提反对意见......再来一次.楼上好像都默认楼主说的"strtr比str_replace快四倍"的说法是正确的....
    现在网上搜了一下, 英文的没有找到这种说法, 中文的有不少,不过大部分都加了"据说"二字,然后在机器上试了一下:php -r ' echo microtime(true);for($i=0;$i<10000;$i++){ $x=strtr("just a test",array("test"=>"TEST")); }; echo "\n".$x."\n".microtime(true); '1304349351.8423
    just a TEST
    1304349351.8648php -r ' echo microtime(true);for($i=0;$i<10000;$i++){ $x=str_replace("test","TEST","just a test"); } echo "\n".$x."\n".microtime(true); '1304349393.8981
    just a TEST
    1304349393.9116好像.....没有....四倍...那么多....而且好像str_replace更快??!
    我不敢就这么简单测试了就说这个说法错了,但是大家都在机子上试试吧, 欢迎给出更多的测试例子和结果
      

  5.   

    贴出strtr的字符串替换源代码/* {{{ 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-255的字码表,然后从字码表中找出相应的内容,也就是说仅仅是字母对应,
    例如echo strtr("baabbaab", "ab", "01"),"\n"; 意味着 所有的a 等于 0 所有的b 等于 1, 也就是 10011001,这个肯定是相当的快而数组strtr的数组则是另外一个算法,是要按照字母所在的顺序而替换的,例如echo strtr("baabbaab", array("ab"=>"01")),"\n";意味着仅仅只有'ab' 等于 01, 也就是 ba01ba01同理 str_replace也是需要根据字母顺序进行替换
      

  6.   

    很遗憾,lz的论据有误!
    无论怎样测试 strtr 的速度都不快于 str_replace。
    当 str_replace 的第1、2个参数均为数组时,速度才与 strtr 相同