Raskaiden operaatioiden toiston optimointi JavaScriptissä
Edellisessä oppitunnissa funktioiden toistuvat kutsut veivät todellisuudessa hyvin vähän aikaa ja meidän optimointimme säästi ei kovin paljon. Kuitenkin, kaikki on paljon huonommin, jos teemme useita kertoja kutsun "raskaille" funktioille, jotka suorittavat tarpeeksi pitkän ajan.
Oletetaan esimerkiksi, että meillä on funktio, joka löytää luvun jakajat:
function getDivisorsSum(num) {
let res = 0;
for (let i = 1; i <= num; i++) {
if (num % i === 0) {
res += i;
}
}
return res;
}
On ilmeistä, että tämä funktio on tarpeeksi "raskas". Siksi huono idea olisi kirjoittaa tällainen koodi:
let num = 123456;
if (getDivisorsSum(num) >= 10 && getDivisorsSum(num) <= 100) {
console.log('+++');
} else {
console.log('---');
}
Parempi on tietysti suorittaa "raskas" operaatio yksi kerta ja tulos tallentaa muuttujaan, ja sitten käyttää tätä muuttujaa tarvittavissa paikoissa:
let num = 123456;
let sum = getDivisorsSum(num);
if (sum >= 10 && sum <= 100) {
console.log('+++');
} else {
console.log('---');
}
Optimoi alla oleva koodi:
let num = 1233456789;
if (getSumSquare(num) >= 10 && getSumSquare(num) <= 100) {
console.log('+++');
} else {
console.log('---');
}
function getSumSquare(num) {
let digits = String(num).split('');
let sum = 0;
for (let digit of digits) {
sum += digit ** 2;
}
return sum;
}