程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 比較strtr, str_replace和preg_replace三個函數的效率

比較strtr, str_replace和preg_replace三個函數的效率

編輯:關於PHP編程

    之前已經分析過strtr的源碼了,現在就比較strtr, str_replace和preg_replace的效率:

    復制代碼 代碼如下:
    $str =
    '111111110000000000000000000000000000000111000001000100010000010010000010010000010100000010
    ';
    $str = str_repeat($str, 1);
    $pattern1 = array('12345'=>'', '67891'=>'');
    $pattern2 = array('a'=>'', '1234567890'=>'');
    $pattern3 = '/12345|67891/';
    $pattern4 = '/a|1234567890/';
    $pattern5 = array('12345', '67891');
    $pattern6 = array('a', '1234567890');
    $t = microtime(true);
    for($i=0; $i<10000; $i++)
    {
    strtr($str, $pattern1);
    }
    echo microtime(true)-$t, "/n"; //0.21915886878967 0.47268319129944
    $t = microtime(true);
    for($i=0; $i<10000; $i++)
    {
    strtr($str, $pattern2);
    }
    echo microtime(true)-$t, "/n"; //0.4768660068512 2.7257590293884
    $t = microtime(true);
    for($i=0; $i<10000; $i++)
    {
    preg_replace($pattern3, '', $str);
    }
    echo microtime(true)-$t, "/n"; //0.30504012107849 1.0864448547363
    $t = microtime(true);
    for($i=0; $i<10000; $i++)
    {
    preg_replace($pattern4, '', $str);
    }
    echo microtime(true)-$t, "/n"; //0.30298089981079 1.117014169693
    $t = microtime(true);
    for($i=0; $i<10000; $i++)
    {
    str_replace($pattern5, '', $str);
    }
    echo microtime(true)-$t, "/n"; //0.18029189109802 0.22510504722595
    $t = microtime(true);
    for($i=0; $i<10000; $i++)
    {
    str_replace($pattern6, '', $str);
    }
    echo microtime(true)-$t, "/n"; //0.18104100227356 0.23055601119995
    //說明:當str_repeat的第二個參數為1時輸出第一個數字,當為8時輸出第二個數字


    從輸出結果來看,str_replace的整體表現相對strtr和preg_replace要好的。原因從查看str_replace的源碼(http://code.google.com/p/cyy0523xc/source/browse/trunk/php/str_replace%E6%BA%90%E7%A0%81.c) 就可以看出,str_replace(array search, string|array replace, string subject)在執行的時候會對search的每一個元素按照先後順序進行循環(不是按照下標或者其他的什麼順序,這個和數組在底層的實現有關),然後 到subject中去匹配,如果找到就替換為相應的replace。這樣從效率上的確會比strtr好,因為還會多一個從下標的最大長度到最小長度的循 環,如果這時下標字符串的長度變化比較大的話,且subject字符串比較長的話,這裡的開銷也是比較大的。不過str_replace這樣的實現也有個 我們需要注意的地方,就是它不會像strtr那樣最大匹配優先。例如:

    復制代碼 代碼如下:
    str_replace(array('ab', 'abc'), '1', 'abcd');


    如果使用的是strtr,我們輸出的結果會是“1d”,因為strtr會實現最大匹配。但是str_replace卻會輸出“1cd”,因為在search字符串中‘ab'排在“abc”的前面,所以會先把‘ab'替換成了‘1'。

    現在小結一下這三個函數的用法:
    str_replace:
    這個應該作為字符串替換的首選方法,不過有一點需要注意,就是把最希望匹配的元素放在前面。(為了效率的提升,有時這樣做也是值得的)

    strtr: strtr在短字符串替換的時候也是挺高效的,不過search數組的下標長度的差別也對效率產生比較大的影響,還有就是沒事最好不要使用strtr(string, string, string)這種形式(對於非單字節字符很容易產生亂碼)。

    preg_replace:這個不用說,可以使用正則匹配,功能絕對是最強的,不過也是要犧牲一點效率的。

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved