АКЦИЯ: бесплатные месячные курсы по созданию сайтов
на выбор: верстка, JavaScript, PHP или фреймворки. Сегодня последний день для записи! Жми!
⊗jsSpOtMm 278 of 294 menu
Долгожданный Бесплатный курс по выкладке сайта на хостинг. МЫ УЖЕ НАЧАЛИ! Присоединяйтесь к нам!

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

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

enru