Pengoptimuman Penggunaan Memori dalam JavaScript
Semua pembolehubah yang dicipta disimpan dalam memori RAM komputer. Kadang-kadang penulisan kod tanpa berfikir boleh meningkatkan penggunaan memori dengan mendadak.
Mari kita lihat sebuah contoh.
Katakan kita diberi tugas untuk mencari
hasil tambah integer dari 1
hingga 100000000.
Katakan kita mempunyai satu fungsi
yang mengisi array
dengan integer dari
julat yang diberikan:
function fillArr(a, b) {
let res = [];
for (let i = a; i <= b; i++) {
res.push(i);
}
return res;
}
Katakan kita juga mempunyai fungsi yang mencari hasil tambah elemen array:
function getSum(arr) {
let sum = 0;
for (let elem of arr) {
sum += elem
}
return sum;
}
Dengan gabungan fungsi-fungsi ini, tugas yang diberikan boleh diselesaikan dengan mudah:
let sum = getSum(fillArr(1, 100000000));
Penyelesaiannya menjadi elegan. Namun, terdapat satu masalah: ia menggunakan jumlah memori RAM yang sangat besar.
Mari kita kira. Fungsi fillArr
mencipta array dengan 100000000 nombor.
Katakan JavaScript memperuntukkan 2 bait
untuk setiap nombor - maka untuk menyimpan array kita, diperlukan
200000000 bait, iaitu lebih kurang
200 megabait memori RAM.
Tetapi sebenarnya, lebih banyak memori RAM akan diperlukan kerana dalam JavaScript terdapat perbelanjaan tambahan yang sangat besar ketika menyimpan array.
Dengan memahami masalahnya, adalah mudah untuk mencipta fungsi yang menyelesaikan tugas dan hampir tidak menggunakan memori RAM:
function getNumsSum(max) {
let sum = 0;
for (let i = 1; i <= max; i++) {
sum += i;
}
return sum;
}
Mari selesaikan tugas dengan menggunakan fungsi kita:
let sum = getNumsSum(100000000);
Seorang pengaturcara diberi tugas untuk mencari
bilangan nombor yang boleh dibahagi tepat dengan
7, berada dalam julat yang diberikan.
Dia menyelesaikannya dengan cara berikut:
let arr = [];
for (let i = 0; i <= 1000; i++) {
if (i % 7 == 0) {
arr.push(i);
}
}
console.log(arr.length);
Terangkan, apa yang salah dengan kod ini. Ubahsuai kod tersebut kepada versi yang lebih optimum.
Seorang pengaturcara diberi tugas untuk mencari hasil tambah pembahagi suatu nombor. Dia menyelesaikannya dengan cara berikut:
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);
Terangkan, apa yang salah dengan kod ini. Ubahsuai kod tersebut kepada versi yang lebih optimum.