# Оптимизация потребления памяти в 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);`

Объясните, что не так с этим кодом. Переделайте код на более оптимальный.

← →
↑
en ru