⊗jsSpOtMm 278 of 294 menu

Оптимизация на потреблението на памет в 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);

Обяснете какво не е наред с този код. Преправете кода по-оптимален.

Български
AfrikaansAzərbaycanবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Ние използваме бисквитки за работата на сайта, анализ и персонализация. Обработката на данни се извършва в съответствие с Политика за поверителност.
приемам всички настройки отхвърляне