preg_replace hız optimizasyonu

3 Cevap php

stripping out all characters from a string, leaving numbers arasında kabul edilen yanıt bakarken, yazar ifadeden sonra bir + eklendi

$str = preg_replace('/[^0-9.]+/', '', $str);

kaldırmak için, yerine tek olaylar alt dizeleri bulmak için. Işlevselliği için + isteğe bağlıdır. Ama ben + daha hızlı olup ekleyerek olmadığını merak etmeye başladı. (Veya herhangi bir fark var değil mi?)

Ben daha az olması nedeniyle dize ve bellek kullanımı için, daha hızlı olduğunu varsayalım. Ama aynı zamanda daha karmaşık regex ifadeler basit olanlardan daha yavaş olduğunu anlamak olabilir.

Alt dizeleri kaldırmak için bu tekniği kullanıyor Yani bir büyük ya da küçük alt dizeleri bulmak için çalışmalısınız?

3 Cevap

Benchmark sonuçları çok fazla okumam. Onlar iyi yapmak inanılmaz zor. Gerçekten, bu gelen almalıdır tek şey tekrarı süresi uzun olduğu tekrarlama, dizeleri bazı türlerine daha hızlı olabilir olmasıdır.

Kolayca PCRE'nin farklı bir sürümü ile değiştirebilirsiniz şeyler Bu tip.


function tst($pat, $str) {
    $start = microtime(true);
    preg_replace($pat, '', $str);
    return microtime(true) - $start;
}
$strs = array(
    'letters' => str_repeat("a", 20000),
    'numbers' => str_repeat("1", 20000),
    'mostly_letters' => str_repeat("aaaaaaaaaaaaa5", 20000),
    'mostly_numbers' => str_repeat("5555555555555a", 20000)
);
$pats = array(
    'rep' => '/[^0-9.]+/',
    'norep' => '/[^0-9.]/'
);

//precompile patterns(php caches them per script) and warm up microtime
microtime(true);
preg_replace($pats['rep'], '', 'foo');
preg_replace($pats['norep'], '', 'foo');

foreach ($strs as $strname => $str) {
    echo "$strname\n";
    foreach ($pats as $patname => $pat) {
        printf("%10s    %.5f\n", $patname, tst($pat, $str));
    }
}

Ben herhangi bir test yapmadım ama yerine süreci daha az kez idam edilmelidir böylece + ile daha fazla karakter maç. Eğer düzenli ifade + yazmak yoksa değiştirme yerine bütün bir altdizesine yerine her karakter yapılır, bu yüzden daha yavaş olduğunu düşünüyorum edilir.

I chris olarak önerilen bazı hızlarda testler koştu. Onun kod I ile karşılaştırıldığında:

  • karşılaştırma için str_replace ekledi:
$str_replace_array = array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.');

function tst($pat, $str) {
    global $str_replace_array;
    $start = microtime(true);
    if($pat == '')
        str_replace($str_replace_array, '', $str);
    else
        preg_replace($pat, '', $str);
    return microtime(true) - $start;
}
  • Tüm dizeleri aynı uzunlukta yapılmış, böylece daha iyi sonuçlar karşılaştırıldığında olabilir

: In Sonuçlar

letters
         rep    0.00298
       norep    0.06953
 str_replace    0.00406

numbers
         rep    0.02867
       norep    0.02612
 str_replace    0.01242

mostly_letters
         rep    0.00931
       norep    0.06649
 str_replace    0.00593

mostly_numbers
         rep    0.03285
       norep    0.02942
 str_replace    0.01359

Bu (taşıma daha az bellek?) Büyük bloklar değiştirirken (+ eklendi) yinelenen regex çok daha hızlı olduğunu gösteriyor Ama hayır tekrarı regex biraz daha hızlı değil çok ihtiyacı değiştirilmesi durumdur.

Ayrıca, str_replace is basically always daha hızlı (iki kez hız) bir regex tam dize maçlar hariç regex yerine, daha.