ოპერატიული მეხსიერების ოპტიმიზაცია JavaScript-ში

ყველა შექმნილი ცვლადი ინახება კომპიუტერის ოპერატიულ მეხსიერებაში. ზოგჯერ უაზრო კოდის წერა შეიძლება მკვეთრად გაზარდოს მოხმარებული მეხსიერება.

მოდით შევხედოთ მაგალითს. დავუშვათ, ჩვენ წინაშე დგას ამოცანა ვიპოვოთ მთელი რიცხვების ჯამი 1-დან 100000000-მდე. დავუშვათ, ჩვენ გვაქვს ფუნქცია, რომელიც ავსებს მასივს მთელი რიცხვებით მოცემული დიაპაზონიდან:

javascriptfunction fillArr(a, b) {
  let res = [];
  
  for (let i = a; i <= b; i++) {
    res.push(i);
  }
  
  return res;
}

დავუშვათ, ჩვენ ასევე გვაქვს ფუნქცია, რომელიც პოულობს ელემენტების ჯამს მასივის:

javascriptfunction getSum(arr) {
  let sum = 0;
  
  for (let elem of arr) {
    sum += elem
  }
  
  return sum;
}

ამ ფუნქციების კომბინაციის საშუალებით შეგვიძლია მარტივად გადავჭრათ დასმული ამოცანა:

javascriptlet sum = getSum(fillArr(1, 100000000));

მივიღეთ ელეგანტური ამოხსნა. მასში, თუმცა, არის პრობლემა: ის მოიხმარს უზარმაზარ რაოდენობის ოპერატიულ მეხსიერებას.

მოდით გამოვთვალოთ. ფუნქცია fillArr ქმნის მასივს 100000000 რიცხვით. დავუშვათ, JavaScript რიცხვისთვის გამოყოფს 2 ბაიტს - მაშინ ჩვენი მასივის შესანახად დაგვჭირდება 200000000 ბაიტი, ანუ დაახლოებით 200 მეგაბაიტი ოპერატიული მეხსიერების.

მაგრამ სინამდვილეში ოპერატიული მეხსიერება ბევრად მეტი იქნება საჭირო იმის გამო, რომ JavaScript-ში ძალიან დიდია ზედმეტი დანახარჯები მასივის შენახვისას.

პრობლემის გაგებით, მარტივია ფუნქციის შექმნა, რომელიც ხსნის ამოცანას და პრაქტიკულად არ მოიხმარს ოპერატიულ მეხსიერებას:

javascriptfunction getNumsSum(max) {
  let sum = 0;
  
  for (let i = 1; i <= max; i++) {
    sum += i;
  }
  
  return sum;
}

მოდით გადავჭრათ ამოცანა ჩვენი ფუნქციის საშუალებით:

javascriptlet sum = getNumsSum(100000000);
Задание 1

ზოგიერთ პროგრამისტს წინაშე დგას ამოცანა ვიპოვოთ რიცხვების რაოდენობა, რომლებიც ნაშთების გარეშე იყოფიან 7-ზე, მოცემულ ინტერვალში. მან მოაგვარა იგი შემდეგნაირად:

javascriptlet arr = [];

for (let i = 0; i <= 1000; i++) {
  if (i % 7 == 0) {
    arr.push(i);
  }
}

console.log(arr.length);

ახსენით, რა არასწორია ამ კოდში. გადააკეთეთ კოდი უფრო ოპტიმალურად.

Задание 2

ზოგიერთ პროგრამისტს წინაშე დგას ამოცანა ვიპოვოთ რიცხვის გამყოფების ჯამი. მან მოაგვარა იგი შემდეგნაირად:

javascriptfunction 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);

ახსენით, რა არასწორია ამ კოდში. გადააკეთეთ კოდი უფრო ოპტიმალურად.