⊗jsSpOtMm 278 of 294 menu

Muistin käytön optimointi JavaScriptissä

Kaikki luodut muuttujat tallennetaan tietokoneen keskusmuistiin. Joskus ajattelematon koodin kirjoittaminen voi kasvattaa muistinkulutusta jyrkästi.

Katsotaanpa esimerkkiä. Oletetaan, että tehtävämme on löytää kokonaislukujen summa välillä 1 100000000:aan. Oletetaan, että meillä on funktio, joka täyttää taulukon kokonaisluvuilla annetulta väliltä:

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

Oletetaan, että meillä on myös funktio, joka löytää taulukon elementtien summan:

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

Näiden funktioiden yhdistelmällä voimme helposti ratkaista asetetun tehtävän:

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

Ratkaisu on elegantti. Siinä on kuitenkin ongelma: se kuluttaa valtavasti keskusmuistia.

Lasketaanpa. Funktio fillArr luo taulukon, jossa on 100000000 numeroa. Oletetaan, että JavaScript varaa numerolle 2 tavua - silloin taulukkomme tallentamiseen tarvitaan 200000000 tavua, eli noin 200 megatavua keskusmuistia.

Mutta todellisuudessa keskusmuistia tarvitaan paljon enemmän, koska JavaScriptissä on hyvin suuret yleiskulut taulukon tallennuksessa.

Ymmärtämällä ongelman, on helppo tehdä funktio, joka ratkaisee tehtävän ja käyttää käytännössä ei keskusmuistia:

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

Ratkaistaan tehtävä funktiollamme:

let sum = getNumsSum(100000000);

Erään ohjelmoijan tehtävänä oli löytää niiden numeroiden määrä, jotka jaettavissa ilman jakojäännöstä 7:llä, annetulla välillä. Hän ratkaisi sen seuraavalla tavalla:

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

Selittäkää, mikä tässä koodissa on vialla. Muokaatkaa koodi optimaalisemmaksi.

Erään ohjelmoijan tehtävänä oli löytää luvun tekijöiden summa. Hän ratkaisi sen seuraavalla tavalla:

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

Selittäkää, mikä tässä koodissa on vialla. Muokaatkaa koodi optimaalisemmaksi.

Suomi
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Käytämme evästeitä verkkosivuston toiminnalle, analytiikalle ja personoinnille. Tietojen käsittely tapahtuu Tietosuojakäytännön mukaisesti.
hyväksy kaikki mukauta hylkää