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ä:
javascriptfunction 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:
javascriptfunction 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:
javascriptlet 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:
javascriptfunction getNumsSum(max) {
let sum = 0;
for (let i = 1; i <= max; i++) {
sum += i;
}
return sum;
}
Ratkaistaan tehtävä funktiollamme:
javascriptlet 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:
javascriptlet 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:
javascriptfunction 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.