Raskete operatsioonide kordamise optimeerimine JavaScriptis

Eelmises õppetükis võtsid funktsioonide korduvad väljakutsed tegelikult väga vähe aega ja meie optimeerimine säästis mitte väga palju. Kuid kõik muutub palju hullemaks, kui teeme mitu korda väljakutse "raskele" funktsioonile, mis võtab täitmiseks piisavalt pikka aega.

Oletame näiteks, et meil on funktsioon, mis leiab arvu jagajad:

javascriptfunction getDivisorsSum(num) {
  let res = 0;
  
  for (let i = 1; i <= num; i++) {
    if (num % i === 0) {
      res += i;
    }
  }
  
  return res;
}

Ilmselgelt on see funktsioon piisavalt "raske". Seetõttu oleks halb idee kirjutada selline kood:

javascriptlet num = 123456;

if (getDivisorsSum(num) >= 10 && getDivisorsSum(num) <= 100) {
  console.log('+++');
} else {
  console.log('---');
}

Paremini on muidugi teha "raske" operatsioon üks kord ja kirjutada tulemus muutujasse, siis kasutada seda muutujat vajalikes kohtades:

javascriptlet num = 123456;
let sum = getDivisorsSum(num);

if (sum >= 10 && sum <= 100) {
  console.log('+++');
} else {
  console.log('---');
}
Задание 1

Optimeerige allolev kood:

javascriptlet 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;
}