Оптимизација на потрошувачката на меморија во JavaScript
Сите креирани променливи се чуваат во оперативната меморија на компјутерот. Понекогаш неразумното пишување код може драстично да ја зголеми потрошувачката на меморија.
Да погледнеме на пример.
Нека пред нас стои задачата да го најдеме
збирот на цели броеви од 1
до 100000000.
Нека имаме функција,
која го пополнува низата
со цели броеви од даден
опсег:
function fillArr(a, b) {
let res = [];
for (let i = a; i <= b; i++) {
res.push(i);
}
return res;
}
Нека имаме и функција, која го наоѓа збирот на елементите на низата:
function getSum(arr) {
let sum = 0;
for (let elem of arr) {
sum += elem
}
return sum;
}
Со комбинација на овие функции лесно може да се реши поставената задача:
let sum = getSum(fillArr(1, 100000000));
Се доби елегантно решение. Во него, сепак, има проблем: троши огромно количина на оперативна меморија.
Ајде да пресметаме. Функцијата fillArr
креира низа со 100000000 броеви.
Нека JavaScript доделува 2 бајти
за секој број - тогаш за чување на нашата низа ќе бидат потребни
200000000 бајти, односно нешто околу
200 мегабајти оперативна меморија.
Но, всушност, ќе биде потребна многу повеќе оперативна меморија поради тоа што JavaScript има многу големи дополнителни трошоци при чување на низа.
Разбирајќи ја проблематиката, лесно може да се направи функција, која ја решава задачата и практично не троши оперативна меморија:
function getNumsSum(max) {
let sum = 0;
for (let i = 1; i <= max; i++) {
sum += i;
}
return sum;
}
Да ја решиме задачата со нашата функција:
let sum = getNumsSum(100000000);
Пред некој програмер стоеше задачата да го најде
количеството броеви, кои се деливи без остаток со
7, и кои се наоѓаат во даден
интервал. Тој ја реши така на следниов начин:
let arr = [];
for (let i = 0; i <= 1000; i++) {
if (i % 7 == 0) {
arr.push(i);
}
}
console.log(arr.length);
Објаснете, што не е во ред со овој код. Преработете го кодот за да биде пооптимален.
Пред некој програмер стоеше задачата да го најде збирот на делителите на број. Тој ја реши на следниов начин:
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);
Објаснете, што не е во ред со овој код. Преработете го кодот за да биде пооптимален.