⊗jsSpOtMm 278 of 294 menu

Optimalizace spotřeby paměti v JavaScriptu

Všechny vytvořené proměnné jsou uloženy v operační paměti počítače. Někdy bezmyšlenkovité psaní kódu může prudce zvýšit spotřebovanou paměť.

Podívejme se na příklad. Předpokládejme, že máme za úkol najít součet celých čísel od 1 do 100000000. Předpokládejme, že máme funkci, která naplní pole celými čísly z daného rozsahu:

function fillArr(a, b) { let res = []; for (let i = a; i <= b; i++) { res.push(i); } return res; }

Předpokládejme také, že máme funkci, která najde součet prvků pole:

function getSum(arr) { let sum = 0; for (let elem of arr) { sum += elem } return sum; }

Pomocí kombinace těchto funkcí lze snadno vyřešit zadaný úkol:

let sum = getSum(fillArr(1, 100000000));

Vzniklo elegantní řešení. V něm však existuje problém: spotřebovává obrovské množství operační paměti.

Pojďme si to spočítat. Funkce fillArr vytváří pole s 100000000 čísly. Předpokládejme, že JavaScript alokuje na číslo 2 bajty - pak pro uložení našeho pole bude potřeba 200000000 bajtů, tedy přibližně 200 megabajtů operační paměti.

Ve skutečnosti bude potřeba mnohem více operační paměti kvůli tomu, že JavaScript má velmi velké režijní náklady při ukládání pole.

S pochopením problému lze snadno vytvořit funkci, která úkol řeší a prakticky nespotřebovává operační paměť:

function getNumsSum(max) { let sum = 0; for (let i = 1; i <= max; i++) { sum += i; } return sum; }

Vyřešme úkol pomocí naší funkce:

let sum = getNumsSum(100000000);

Před určitým programátorem byl úkol najít počet čísel dělitelných beze zbytku 7, nacházejících se v zadaném intervalu. Vyřešil jej následujícím způsobem:

let arr = []; for (let i = 0; i <= 1000; i++) { if (i % 7 == 0) { arr.push(i); } } console.log(arr.length);

Vysvětlete, co je na tomto kódu špatně. Přepracujte kód na optimalizovanější.

Před určitým programátorem byl úkol najít součet dělitelů čísla. Vyřešil jej následujícím způsobem:

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);

Vysvětlete, co je na tomto kódu špatně. Přepracujte kód na optimalizovanější.

Čeština
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяDanskDeutschΕλληνικά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
Používáme soubory cookie pro fungování webu, analýzu a personalizaci. Zpracování údajů probíhá v souladu s Zásadami ochrany osobních údajů.
přijmout vše přizpůsobit odmítnout