PHP Foreach döngü Verimlilik

4 Cevap php

Ben buna benzer PHP içinde bir foreach döngü kullanıyorum:

foreach ($class->getAttributes() as $attribute) {
// Work
}

Verimliliği ile ilgili olarak, foreach döngü dışında bir $attributes = $class->getAttributes(); bildirimde ve $attributes değişkeni üzerinde yineleme için daha iyidir? Veya sadece başında foreach bildiriminde kez denilen alma $class->getAttributes() ifadedir?

(Ben bu durumda bir big verimliliği endişe olmayabilir farkındayım, ama ben bu ve diğer büyük durumlarda prensibini bilmek istiyorum)

Teşekkürler,

Steve

4 Cevap

$class->getAttributes() foreach döngünün dışında ve geçici bir değişken kullanarak kullanarak veya yazdı tutarak performansları hakkında bir şey değiştirmek gerekir: it will still be evaluated only once.

Ve bunu kanıtlıyor bir örnek:

function get_array() {
    echo 'function called !<br />';
    return array(
        'first' => 123,
        'second' => 456,
        'last' => 789, 
    );
}
foreach (get_array() as $key => $value) {
    echo "$key : $value<br />";
}

I am using a function and not a method of a class, to get a shorter example, but the principle would be the same with a class+method.


And calling this portion of code gives the following output :

function called !
first : 123
second : 456
last : 789

yani get_array() işlevi yalnızca foreach döngünün başında, bir kez olarak adlandırılır.

Ben test etmedim, ama ben böyle bir şey yaptığını düşünmek istiyorum:

$attributes = $class->getAttributes();
foreach($attributes as $attribute)
{

}

Daha okunabilir olduğunu ve gerekirse foreach sonuçlandırmak sonra size nitelikleri alabilirsiniz.

Ancak, sorunun bir daha doğrudan yanıt, getAttributes() sadece bir kez iki durumda da denilen edilecektir.

Diğerleri söylediler, sizin örnekte fonksiyon yalnızca bir kez denir.

Önceden değerlendiren bir fark yaratabilir hangi durumda döngüler içindir.

$str = 'abcdefghijklmnop';

//strlen will be called on every iteration
for($i = 0; $i < strlen($str); $i++);

//strlen will only be called once
$len = strlen($str);
for($i = 0; $i < $len; $i++);