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.