Заметки за ноябрь 2018 года

Размер объекта в памяти

Если вам для каких-то целей потребовалось узнать сколько памяти занимает какой-либо объект в браузере, то инструменты разработки помогут вам это сделать. В Chrome DevTools в разделе Memory можно сделать снимок памяти и посмотреть какие там есть объекты на данный момент времени. Однако, без подготовки найти нужные данные будет совсем не просто.

Процесс поиска нужного объект можно значительно облегчить, если вынести его в глобальную область видимости и изучать только разницу между двумя состояниями (до появления этого объекта и после).

Начнем с того, что сделаем первый снимок памяти браузера.

Делаем начальный снимок памяти

Теперь переключимся в раздел Console и добавим какой-то тестовый объект.

Создаем объект в консоли

Затем делаем ещё один снимок памяти. Укажем в селекторе, что нужно показать только объекты, созданные между первым и вторым снимком.

Retained size объекта

В списке станет значительно меньше данных. Нас интересует именно Object. И первым же выбранным элементом оказывается наш тестовый объект.

В колонке Retained Size будет указано сколько памяти он занимает. В моём случае это 2488 байт.

Создадим ещё аналогичный объект, но с другими данными.

Создаем другой объект в консоли

Сделаем ещё один снимок экрана и обнаружим, что размер занимаемой памяти теперь значительно уменьшился. Второй объект у меня занимает 736 байт.

Новый объект занимает меньше памяти

Такое поведение браузера обусловлено тем, что для каждого объекты хранятся в различных представлениях в зависимости от их сложности. Когда во время исполнения кода появляются одинаковые по структуре объекты, то браузер значительно оптимизирует расходы памяти.

Грубо оценить эти расходы можно следующим образом:

  • 2 байта на символ строки
  • 8 байт на число
  • 4 байта на булевское значение

Значит мои тестовые объект со случайными значениями полей будут занимать примерно 420-500 байт. Плюс, нужно учесть накладные расходы на хранение структур самих объектов.

Чтобы проверить эту оценку, загрузим 10 тысяч объектов, подобных тем, что я использовал в предыдущих примерах.

Загружаем 10000 объектов

Чтобы значение, обрабатываемое в промисе, не потерялось, так же сохраняем его в глобальную переменную.

Теперь в снимке памяти нас интересует массив.

Массив с тестовыми данными

Итак, загруженные данные (10 тысяч объектов) занимают 4959384 байта, что в пересчете на один объект будет 496 байт. Это значение хорошо вписывается в оценку.

Оставте свой комментарий