Оптимизация потребления памяти в 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);
Объясните, что не так с этим кодом. Переделайте код на более оптимальный.