ოპერატიული მეხსიერების ოპტიმიზაცია 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);
ახსენით, რა არასწორია ამ კოდში. გადააკეთეთ კოდი უფრო ოპტიმალურად.