Оптимизатсияи истифодаи хотира дар JavaScript
Ҳама тағйирёбандаҳои сохташуда дар ҳофизаи оперативии компютер нигоҳ дошта мешаванд. Гаҳегона навиштани беҳушонаи рамз метавонад хотираи истифодашавандаро тез афзоиш диҳад.
Биёед ба мисол нигарем.
Бигзор дар назари мо вазифаи ёфтани
ҷамъи ададҳои бутун аз 1
то 100000000 бошад.
Бигзор мо функсияе дорем,
ки массивро бо
ададҳои бутуни аз диапазони
додашуда пур мекунад:
function fillArr(a, b) {
let res = [];
for (let i = a; i <= b; i++) {
res.push(i);
}
return res;
}
Бигзор инчунин функсияе дорем, ки ҷамъи унсурҳои массивро меёбад:
function getSum(arr) {
let sum = 0;
for (let elem of arr) {
sum += elem
}
return sum;
}
Бо истифода аз комбинатсияи ин функсияҳо метавон ба осонӣ вазифаи додашударо ҳал кард:
let sum = getSum(fillArr(1, 100000000));
Ҳалли зебо ба даст омад. Аммо дар он, мушкиле вуҷуд дорад: он миқдори бузурги ҳофизаи оперативиро истифода мекунад.
Биёед ҳисоб кунем. Функсияи fillArr
массив бо 100000000 адад месозад.
Бигзор JavaScript барои ҳар адад 2 байт
ҷудо мекунад - пас барои нигоҳ доштани массиви мо
200000000 байт лозим аст, яъне тақрибан
200 мегабайти хотираи оперативӣ.
Вале дар асл ба хотираи оперативӣ аз ин ҳам бештар лозим аст, зеро дар JavaScript харҷҳои иловагии хеле бузург ҳангоми нигоҳ доштани массив вуҷуд доранд.
Бо фаҳмидани мушкил, осон аст функсияе сохт, ки вазифаро ҳал карда ва амалан хотираи оперативиро истифода накунад:
function getNumsSum(max) {
let sum = 0;
for (let i = 1; i <= max; i++) {
sum += i;
}
return sum;
}
Биёед вазифаро бо истифода аз функсияи худ ҳал кунем:
let sum = getNumsSum(100000000);
Дар назди баъзе барномасоз вазифаи ёфтани
миқдори ададҳое, ки бе боқимонда ба
7 тақсим мешаванд, дар диапазони
додашуда қарор доштанд. Ӯ онро ба ин тарз ҳал кард:
let arr = [];
for (let i = 0; i <= 1000; i++) {
if (i % 7 == 0) {
arr.push(i);
}
}
console.log(arr.length);
Шарҳ диҳед, ки ин рамз чӣ мушкилӣ дорад. Рамзро ба оптималтар табдил диҳед.
Дар назди баъзе барномасоз вазифаи ёфтани ҷамъи тақсимкунандаҳои адад қарор дошт. Ӯ онро ба ин тарз ҳал кард:
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);
Шарҳ диҳед, ки ин рамз чӣ мушкилӣ дорад. Рамзро ба оптималтар табдил диҳед.