ugrás a tartalomhoz

What's the Fastest Way to Code a Loop in JavaScript?

yaanno · 2009. Május. 18. (H), 14.13
Kimerítő elemzés a natív és HTML gyűjtemény feletti loopolásról
 
1

kis összefoglalás

Hodicska Gergely · 2009. Május. 20. (Sze), 02.05
Találhatták volna valami jobb tálalási módot a tesztek eredményeinek közlésére, mert így elég kusza a kép, valamint némi summázás nem ártott volna. Épp olvasgattam erről a témáról mostanában, ezért pár dolgot kiemelnék, ami helyenként a teszteken is látszik.

HTML collection: egy HTML collection egy property-jének eléresekor egy live query történik, ezért lényegesen lassabb, mint ha csak egy sima tömböt babrálnánk. Ezért adott esetben (ha több műveletet is szeretnénk végezni az elemekkel) az is megéri, hogy egyszer végigmegyünk a HTML collectionön, és az elemeket átpakoljuk egy tömbbe, majd ezen babrálunk.

valami.length: érdemes ezt kirakni egy lokális változóba, mert ennek a lookupja általában gyorsabb, mint a property lookup. Ez az előbbi pont miatt fokozottan érdekes HTML collectionök esetén.

i++ helyett i--: érdemes a ciklust átfogalmaznunk, és fordítva végig menni kollekción (for (var i = foo.length; i--; )), mert a nullával való összehasonlítás gyorsabb.

for in ciklus: lehetőleg kerüljük a használatát, ha tudjuk, hogy milyen kulcsokról van szó, akkor érdemes ezeket felvenni egy segédtömbbe, és ezen iterálni sima for ciklussal.

Duff's Device: ezt a cikk nem taglalja, de nagy tömbök esetén gyorsabb eredményt lehet vele elérni, mint a sime for ciklus. Az optimálisnak talált megoldás:
var iterations = Math.floor(values.length / 8);
var leftover = values.length % 8;
var i = 0;

if (leftover > 0){
    do {
        process(values[i++]);
    } while (--leftover > 0);
}

do {
    process(values[i++]);
    process(values[i++]);
    process(values[i++]);
    process(values[i++]);
    process(values[i++]);
    process(values[i++]);
    process(values[i++]);
    process(values[i++]);
} while (--iterations > 0);
2

well said

yaanno · 2009. Május. 20. (Sze), 14.58
Esetleg egy blog postban is összefoglalhatnád a tuningolási lehetőségeket :)