Neden foreach bu kadar yavaş?

3 Cevap php

PHPBench.com Her pageload üzerinde hızlı kriter komut dosyaları çalışır. Bunu yüklediğinizde foreach testi, foreach üçüncü örnek daha çalıştırmak için 4 ila 10 kat daha uzun süre yerde sürer.

Neden bir anadil yapı mantığı kendini gerçekleştirme görünüşe göre daha yavaş olmasıdır?

3 Cevap

Üzgünüm, ama Web sitesi yanlış var. İşte iki hızda hemen hemen aynı olduğunu göstermektedir benim kendi script, ve aslında, foreach daha hızlı!

<?php

function start(){
    global $aHash;
    // Initial Configuration
    $i   = 0;
    $tmp = '';
    while($i < 10000) {
      $tmp .= 'a';
      ++$i;
    }
    $aHash = array_fill(100000000000000000000000, 100, $tmp);
    unset($i, $tmp);
    reset($aHash);
}

/* The Test */
$t = microtime(true);
for($x = 0;$x<500;$x++){
    start();
    $key = array_keys($aHash);
    $size = sizeOf($key);
    for ($i=0; $i<$size; $i++) $aHash[$key[$i]] .= "a";
}
print (microtime(true) - $t);

print ('<br/>');

$t = microtime(true);
for($x = 0;$x<500;$x++){
    start();
    foreach($aHash as $key=>$val) $aHash[$key] .= "a";
}
print (microtime(true) - $t);
?>

Eğer testlerin kaynak koduna bakarsanız: http://www.phpbench.com/source/test2/1/ ve http://www.phpbench.com/source/test2/3/, sen $ aHash her yineleme sonra ilk veri için repopulated olmadığını görebilirsiniz. Daha sonra her test X kez koştu, başında bir kez oluşturulur. Bu anlamda, psuedocode içinde ... her yineleme için giderek artan $ aHash ile çalışıyoruz:

iteration 1: $aHash[10000000000000]=='aaaaaa....10000 times...a';
iteration 2: $aHash[10000000000000]=='aaaaaa....10001 times...a';
iteration 2: $aHash[10000000000000]=='aaaaaa....10002 times...a';

Hep aynı keys olacak çünkü foreach döngü olduğu gibi burada Zamanla, tüm testler için veri çok tabii yineleme 100 ile, her bir yineleme için daha büyük oluyor, array_keys yöntem hızlıdır Giderek büyüyen veri seti ile uğraşmak ve dizilerde values saklamak için!

Eğer sunucu üzerinde yukarıda sağlanan benim kod çalıştırırsanız, o foreach hızlı VE kıvrımlara VE net açıkça görürsünüz.

Sitenin yazarı ne yapmak onun testi amaçlanan ise, o zaman kesinlikle açık değildir, aksi takdirde, geçersiz bir test.

Değişen yük ve diğer etkilerden aşırı miktarda tabidir canlı, yoğun webserver gelen mikro ölçümler için Benchmark sonuçları, göz ardı edilmelidir. Bu içeri kriter bir ortam değil