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?