⊗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
Мы выкарыстоўваем cookie для працы сайта, аналітыкі і персаналізацыі. Апрацоўка дадзеных адбываецца згодна Палітыкай канфідэнцыяльнасці.
прыняць усе наладзіць адхіліць