2012-02-28 59 views

回答

3

我發現this blog已遇到關於你的問題有些睾丸,結果是:

  • strpos()比的preg_match()
  • stripos函數()快3-16倍2-30倍比strpos()
  • stripos函數()比的preg_match()與 無殼改性劑快20-100%的慢 「// I」
  • 使用的preg_match()正則表達式是不大於使用 長更快字符串
  • 使用UTF8修飾語 「// U」 中的preg_match()使得2倍慢

的代碼所用的是:

<?php 

function loop(){ 

$str_50 = str_repeat('a', 50).str_repeat('b', 50); 
$str_100 = str_repeat('a', 100).str_repeat('b', 100); 
$str_500 = str_repeat('a', 250).str_repeat('b', 250); 
$str_1k = str_repeat('a', 1024).str_repeat('b', 1024); 
$str_10k = str_repeat('a', 10240).str_repeat('b', 1024); 
$str_100k = str_repeat('a', 102400).str_repeat('b', 1024); 
$str_500k = str_repeat('a', 1024*500).str_repeat('b', 1024); 
$str_1m = str_repeat('a', 1024*1024).str_repeat('b', 1024); 

$b = 'b'; 
$b_10 = str_repeat('b', 10); 
$b_100 = str_repeat('b', 100); 
$b_1k = str_repeat('b', 1024); 

echo str_replace(',', "\t", ',strpos,preg,preg U,preg S,preg regex,stripos,preg u,'. 
    'preg i,preg u i,preg i regex,stripos uc,preg i uc,preg i uc regex').PHP_EOL; 

foreach (array($b, $b_10, $b_100, $b_1k) as $needle) { 
    foreach (array($str_50, $str_100, $str_500, $str_1k, $str_10k, 
    $str_100k, $str_500k, $str_1m) as $str) { 

    echo strlen($needle).'/'.strlen($str); 

    $start = mt(); 
    for ($i=0; $i<25000; $i++) $j = strpos($str, $needle); // strpos 
    echo "\t".mt($start); 

    $regex = '!'.$needle.'!'; 
    $start = mt(); 
    for ($i=0; $i<25000; $i++) $j = preg_match($regex, $str); // preg 
    echo "\t".mt($start); 

    $regex = '!'.$needle.'!U'; 
    $start = mt(); 
    for ($i=0; $i<25000; $i++) $j = preg_match($regex, $str); // preg Ungreedy 
    echo "\t".mt($start); 

    $regex = '!'.$needle.'!S'; 
    $start = mt(); 
    for ($i=0; $i<25000; $i++) $j = preg_match($regex, $str); // preg extra analysiS 
    echo "\t".mt($start); 

    $regex = "!b{".strlen($needle)."}!"; 
    $start = mt(); 
    for ($i=0; $i<25000; $i++) $j = preg_match($regex, $str); // preg regex 
    echo "\t".mt($start); 

    $start = mt(); 
    for ($i=0; $i<25000; $i++) $j = stripos($str, $needle); // stripos 
    echo "\t".mt($start); 

    $regex = '!'.$needle.'!u'; 
    $start = mt(); 
    for ($i=0; $i<25000; $i++) $j = preg_match($regex, $str); // preg utf-8 
    echo "\t".mt($start); 

    $regex = '!'.$needle.'!i'; 
    $start = mt(); 
    for ($i=0; $i<25000; $i++) $j = preg_match($regex, $str); // preg i 
    echo "\t".mt($start); 

    $regex = '!'.$needle.'!ui'; 
    $start = mt(); 
    for ($i=0; $i<25000; $i++) $j = preg_match($regex, $str); // preg i utf-8 
    echo "\t".mt($start); 

    $regex = "!b{".strlen($needle)."}!i"; 
    $start = mt(); 
    for ($i=0; $i<25000; $i++) $j = preg_match($regex, $str); // preg i regex 
    echo "\t".mt($start); 

    echo PHP_EOL; 
    } 
    echo PHP_EOL; 
} 
} 

function mt($start=null){ 
    if ($start === null) return microtime(true); 
    return number_format(microtime(true)-$start, 4); 
} 

loop(); 
0

標杆管理是一項棘手的業務,但可以說preg_matchstrposstripos要慢。這是因爲PRCE功能實現的REGEX引擎是,其中比字符串函數更強大和更靈活。

他們也做不同的事情。 strpos會告訴你另一個字符串內字符串的開始索引,而preg_match主要用於探測字符串的格式,並根據正則表達式檢索字符串的部分。

總之,如果您只是想在另一個字符串中查找字符串,請使用strposstripos

1

preg_match是三者中最慢的。 stripos將比strpos慢,因爲它將不得不做額外的工作來處理不區分大小寫的匹配。