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?

