JavaScript-də Yaddaş İstehlakının Optimallaşdırılması
Yaradılmış bütün dəyişənlər kompüterin operativ yaddaşında saxlanılır. Bəzən düşünmədən yazılan kod istifadə olunan yaddaşın miqdarını kəskin şəkildə artıra bilər.
Gəlin bir nümunəyə baxaq.
Tutaq ki, bizim vəzifəmiz 1-dən
100000000-dək tam ədədlərin cəmini tapmaqdır.
Tutaq ki, bizdə massivi verilmiş
aralıqdakı tam ədədlərlə
dolduran funksiya var:
function fillArr(a, b) {
let res = [];
for (let i = a; i <= b; i++) {
res.push(i);
}
return res;
}
Tutaq ki, bizdə həmçinin massivin elementlərinin cəmini tapan funksiya da var:
function getSum(arr) {
let sum = 0;
for (let elem of arr) {
sum += elem
}
return sum;
}
Bu funksiyaların birləşməsindən istifadə etməklə qarşıya qoyulmuş vəzifəni asanlıqla həll etmək olar:
let sum = getSum(fillArr(1, 100000000));
Zərif bir həll oldu. Lakin onun problemi var: çox böyük miqdarda operativ yaddaş istehlak edir.
Gəlin hesablayaq. fillArr funksiyası
100000000 ədədi olan massiv yaradır.
Tutaq ki, JavaScript bir ədəd üçün 2 bayt
ayırır - onda bizim massivi saxlamaq üçün
200000000 bayt, yəni təxminən
200 meqabayt operativ yaddaş lazımdır.
Əslində isə, JavaScript-də massivin saxlanması zamanı çox böyük əlavə xərclər olduğundan, daha çox operativ yaddaş tələb olunacaq.
Problemi başa düşməklə, vəzifəni həll edən və praktiki olaraq operativ yaddaş istehlak etməyən funksiya yaratmaq asandır:
function getNumsSum(max) {
let sum = 0;
for (let i = 1; i <= max; i++) {
sum += i;
}
return sum;
}
Gəlin vəzifəni bizim funksiyamızla həll edək:
let sum = getNumsSum(100000000);
Müəyyən bir proqramçının qarşısında verilmiş
aralıqda yerləşən, 7-ə qalıqsız bölünən
ədədlərin sayını tapmaq vəzifəsi dururdu.
O, onu aşağıdakı kimi həll etdi:
let arr = [];
for (let i = 0; i <= 1000; i++) {
if (i % 7 == 0) {
arr.push(i);
}
}
console.log(arr.length);
Bu kodda nəyin səhv olduğunu izah edin. Kodu daha optimal olaraq dəyişdirin.
Müəyyən bir proqramçının qarşısında ədədin bölənlərinin cəmini tapmaq vəzifəsi dururdu. O, onu aşağıdakı kimi həll etdi:
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 nəyin səhv olduğunu izah edin. Kodu daha optimal olaraq dəyişdirin.