Atmiņas patēriņa optimizēšana JavaScript
Visas izveidotās mainīgās vērtības tiek glabātas datora operatīvajā atmiņā. Dažreiz bezrūpīgi rakstīts kods var strauji palielināt patērēto atmiņu.
Apskatīsim piemēru.
Pieņemsim, ka mums ir uzdevums atrast
veselu skaitļu summu no 1
līdz 100000000.
Pieņemsim, ka mums ir funkcija,
kas aizpilda masīvu
ar veseliem skaitļiem no dotā
diapazona:
function fillArr(a, b) {
let res = [];
for (let i = a; i <= b; i++) {
res.push(i);
}
return res;
}
Pieņemsim, ka mums ir arī funkcija, kas atrod masīva elementu summu:
function getSum(arr) {
let sum = 0;
for (let elem of arr) {
sum += elem
}
return sum;
}
Izmantojot šo funkciju kombināciju, var viegli atrisināt uzdevumu:
let sum = getSum(fillArr(1, 100000000));
Izteiksmīgs risinājums. Tomēr tajā ir problēma: tas patērē milzīgu operatīvās atmiņas daudzumu.
Aprēķināsim. Funkcija fillArr
izveido masīvu ar 100000000 skaitļiem.
Pieņemsim, ka JavaScript atvēl 2 baitus
uz vienu skaitli - tad mūsu masīva glabāšanai būs nepieciešami
200000000 baiti, tas ir, aptuveni
200 megabaiti operatīvās atmiņas.
Patiesībā operatīvās atmiņas būs nepieciešams daudz vairāk, jo JavaScript ir ļoti lieli pieskaitāmie izdevumi, glabājot masīvu.
Izprotot problēmu, ir viegli izveidot funkciju, kas atrisina uzdevumu un praktiski nepatērē operatīvo atmiņu:
function getNumsSum(max) {
let sum = 0;
for (let i = 1; i <= max; i++) {
sum += i;
}
return sum;
}
Atrisināsim uzdevumu ar mūsu funkciju:
let sum = getNumsSum(100000000);
Kādam programmētājam bija uzdevums atrast
skaitļu skaitu, kas dalās bez atlikuma ar
7, atrodoties noteiktā
intervālā. Viņš to atrisināja šādi:
let arr = [];
for (let i = 0; i <= 1000; i++) {
if (i % 7 == 0) {
arr.push(i);
}
}
console.log(arr.length);
Paskaidrojiet, kas šajā kodā ir nepareizi. Pārveidojiet kodu uz optimālāku.
Kādam programmētājam bija uzdevums atrast skaitļa dalītāju summu. Viņš to atrisināja šādi:
function getDivisors(num) {
let res = [];
for (let i = 1; i <= num; i++) {
if (num % i === 0) {
res.push(i);
}
}
return res;
}
function getSum(arr) {
let sum = 0;
for (let elem of arr) {
sum += elem
}
return sum;
}
let sum = getSum(getDivisors(320));
console.log(sum);
Paskaidrojiet, kas šajā kodā ir nepareizi. Pārveidojiet kodu uz optimālāku.