var Arr1;
var Arr2 = [];

(Предположим, что Arr1 начинается как неопределенная переменная, а затем становится массивом по мере необходимости.)

Будет ли миллиард Arr1 иметь такой же объем памяти, как миллиард Arr2? Они оба технически пусты, но Arr2 является объектом, что означает, что в определении самого объекта должны быть некоторые издержки, верно?

1
Thomas An 28 Май 2017 в 01:05

2 ответа

Лучший ответ

var Arr1 создает след памяти, который содержит ссылку на ничто. Так что, да, это стоит, но это минимально.

Но var Arr2 = [] создает адрес памяти, который содержит ссылку на новый объект Array, так что там больше места. Несмотря на то, что массив пуст, он является уникальным экземпляром объекта Array, который сам использует один Array.proototype для наследования. Заполнение массива действительно будет занимать память, поскольку даже миллиарду пустых массивов не нужно хранить то, что еще не сохранено Array.prototype. Даже с миллиардом пустых массивов все они наследуются только от одного Array.prototype объекта, и именно здесь хранится собственный API для массивов.

2
Scott Marcus 27 Май 2017 в 22:31

TL; DR: около 90 байт.


Я провел некоторые измерения в Firefox и Chrome (оба в Windows, 64-битные). Firefox гораздо более точен благодаря памяти: но впечатление от Chrome также очевидно. (Я сделал несколько измерений после загрузки страницы и ожидания ее разрешения, затем взял лучшие из них.)

Мой тестовый документ содержал только тип документа и один блок скрипта.

  • Базовая линия (без массивов).

    var x = [];
    for (var i = 0; i < 0; i++) {
        x.push([]);
    }
    

    Firefox: использование памяти js-realm составляет 0,60 МБ.

    Chrome: объем памяти для вкладки составляет 20 880 КБ.

  • Миллион undefined или null с: (следы памяти были одинаковыми)

    var x = [];
    for (var i = 0; i < 1000000; i++) {
        x.push(undefined);  // or x.push(null)
    }
    

    Firefox: использование памяти js-realm составляет 8,1 МБ, из которых класс (Array) / объекты - 8,00 МБ, все это - malloc-heap. (Это предполагает, что он выделил одно слово для каждого из миллиона индексов в содержащем массиве.)

    Chrome: объем памяти для вкладки составляет 31 020 КБ. (Похоже, около 10 байт на undefined.)

  • Миллион массивов .

    var x = [];
    for (var i = 0; i < 1000000; i++) {
        x.push([]);
    }
    

    Firefox: использование памяти js-realm составляет 99,65 МБ, из которых класс (Array) / объекты - 99,55 МБ, из которых 91,55 МБ - это gc-heap, а 8,00 МБ - это malloc-heap. Похоже, около 96 байтов (12 слов) на пустой массив.

    Chrome: объем памяти для вкладки составляет 116 164 КБ. Примерно такие же накладные расходы, как у Firefox.

Итак, вы здесь: похоже, вы получаете примерно 90 байтов служебной информации на [] по сравнению с использованием undefined или null.

3
Chris Morgan 3 Июл 2018 в 08:59