For loop v TS, JS (performance)

V ES6 je nově for of loop, který iteruje nad čímkoliv, co umí iterovat, jako je např. pole a objekt.
A to mě vedlo ke krátkému a opravdu jednoduchému testu, ve kterém jsem si ověřil výkonost jedotlivých for loop konstrukcí.

// jednoduchy test: pole s 10M cisly, ktere iterujeme ruznymi metodami
let arrayOfNums: number[] = [];
const countOfNums: number = 10000000;

function fillArray(count) {
    for (let i = 0; i < count; i++) {
        arrayOfNums[i] = Math.round(Math.random() * 100);
    }
}

let start: number;

start = Date.now();
fillArray(countOfNums);
console.log(`Create time: ${Date.now() - start} ms`);

let dump;

start = Date.now();
for (const num in arrayOfNums) {
    dump = num;
}
console.log(`For in loop: ${Date.now() - start} ms`);

start = Date.now();
for (const num of arrayOfNums) {
    dump = num;
}
console.log(`For of loop: ${Date.now() - start} ms`);

start = Date.now();
for (let i = 0; i < countOfNums; i++) {
    dump = arrayOfNums[i];
}
console.log(`For loop: ${Date.now() - start} ms`);

Výsledky

Env NodeJS Safari Chrome Firefox
Create time 497 209 507 2793
For in 1421 7606 1534 6575
For of 11 36 31 10643
For 11 46 34 8724

Všechny časy jsou v ms.

Několik rychlých závěrů

  • Firefox už dlouho nepoužívám a do testu jsem jej vložil jen pro úplnost. Pozitivní zjištění: o nic jsem nepřišel…
  • Je super, jak je NodeJS opravdu dobře zoptimalizovaný a na prováděný kód téměř nemá žádný vliv prostředí.
  • Chrome: V8 společná s NodeJS je znát. Výkonový rozdíl vyplývá z prostředí ve kterém kód běží a dá se pochopit.
  • Safari má vlastní JS engine SquirrelFish, který je opravdu dobrý…

Poznámka na závěr

Ze zvědavosti jsem chtěl takto otestovat i PHP.

Při pokusu vytvořit pole s 10.000.000 čísly (tak jak jsem to dělal v JS) jsem se dočkal chybové hlášky Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 134217736 bytes) in /Users/pepa/test/looptest/test.php on line 7 a tím jsem testování v PHP odpískal.

Pravdou je, že jsem ještě zkusil zmenšít velikost vytvářeného pole na 10.000, tedy tisíckrát meněí. Jo! Pole se vytvořit podařilo. Pak jsem se zarazil. Tohle chceš vážně testovat?