JavaScript'te Bellek Tüketimini Optimize Etme
Oluşturulan tüm değişkenler bilgisayarın RAM'inde saklanır. Bazen düşüncesizce yazılan kod bellek tüketimini ani bir şekilde artırabilir.
Bir örnek üzerinden inceleyelim.
Önümüzde 1'den
100000000'a kadar olan
tam sayıların toplamını bulma
görevi olduğunu varsayalım.
Bir diziyi verilen aralıktaki
tam sayılarla dolduran bir
fonksiyonumuz olduğunu varsayalım:
function fillArr(a, b) {
let res = [];
for (let i = a; i <= b; i++) {
res.push(i);
}
return res;
}
Ayrıca bir dizinin elemanlarının toplamını bulan bir fonksiyonumuz olduğunu varsayalım:
function getSum(arr) {
let sum = 0;
for (let elem of arr) {
sum += elem
}
return sum;
}
Bu fonksiyonların kombinasyonu ile verilen görevi kolayca çözebiliriz:
let sum = getSum(fillArr(1, 100000000));
Zarif bir çözüm oldu. Ancak, içinde bir problem var: çok büyük miktarda RAM tüketiyor.
Hesaplayalım. fillArr fonksiyonu
100000000 sayı içeren bir dizi
oluşturur. JavaScript'in bir sayı için
2 bayt ayırdığını varsayalım
- bu durumda dizimizi saklamak için
200000000 bayt, yani yaklaşık
200 megabayt RAM gerekli olacak.
Fakat aslında, JavaScript'te bir diziyi saklarken çok fazla ek yük olduğu için çok daha fazla RAM gerekecek.
Sorunu anlayarak, görevi çözen ve neredeyse hiç RAM tüketmeyen bir fonksiyon yapmak kolaydır:
function getNumsSum(max) {
let sum = 0;
for (let i = 1; i <= max; i++) {
sum += i;
}
return sum;
}
Görevi fonksiyonumuzla çözelim:
let sum = getNumsSum(100000000);
Bir programcının önüne, belirli bir
aralıkta bulunan ve 7'ye kalansız
bölünebilen sayıların miktarını bulma
görevi konmuştu. Bunu şu şekilde çözdü:
let arr = [];
for (let i = 0; i <= 1000; i++) {
if (i % 7 == 0) {
arr.push(i);
}
}
console.log(arr.length);
Bu kodda neyin yanlış olduğunu açıklayın. Kodu daha optimize hale getirin.
Bir programcının önüne, bir sayının bölenlerinin toplamını bulma görevi konmuştu. Bunu şu şekilde çözdü:
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);
Bu kodda neyin yanlış olduğunu açıklayın. Kodu daha optimize hale getirin.