Silmukkaoperaatioiden optimointi JavaScriptissä
Jopa kevyt operaatio, joka toistetaan monesti silmukassa, voi kuluttaa paljon resursseja.
Katsotaanpa esimerkkiä. Oletetaan, että meillä on tietty taulukko:
let arr = [1, 2, 3, 4, 5, 6];
Etsitään tämän taulukon elementtien keskiarvo. Tätä varten on löydettävä elementtien summa ja jaettava se elementtien määrällä. Oletetaan, että joku ohjelmoija on jo ratkaissut tämän tehtävän seuraavalla tavalla:
let avg = 0;
for (let elem of arr) {
avg += elem / arr.length;
}
console.log(avg);
Tarkastellaan tällaisen ratkaisun ongelmia. Teknisesti koodi toimii oikein ja antaa oikean vastauksen. Asia on siinä, että matemaattisesti on oikein jakaa koko summa määrällä, kuten myös jakaa jokainen termi erikseen määrällä.
Kuitenkin syntyy toinen ongelma. Asia on siinä, että suoritamme jakolaskun niin monta kertaa kuin taulukossamme on elementtejä. Ja käy ilmi, että teemme valtavan määrän ylimääräisiä operaatioita, sillä jakolaskun olisi voinut suorittaa lopussa - kerran, jakamalla koko löydetyn summan.
Optimoidaan koodimme:
let sum = 0;
for (let elem of arr) {
sum += elem;
}
let avg = sum / arr.length;
console.log(avg);
Optimoi seuraava koodi:
for (let i = 1900; i <= 2100; i++) {
let curr = new Date;
let date = new Date(i, curr.getMonth(), curr.getDate());
if (curr.getDay() === date.getDay()) {
console.log(date);
}
}
Optimoi seuraava koodi:
let obj = {a: 10, b: 20, c: 30, d: 40, e: 50};
let sum = 0;
for (let key in obj) {
if (String(obj[key])[0] === '1' || String(obj[key])[0] === '2') {
sum += obj[key];
}
}
console.log(sum);