С точки зрения использования памяти, в чем разница между этими двумя массивами в JavaScript?

1

Здесь у меня есть массив с элементами, индексы которых разделены с шагом 1.

let noGap = [];
noGap[0] = 0;
noGap[1] = 1;

Здесь у меня есть другой массив, индексы которого разделены индексами намного больше 1.

let gap = [];
gap[0] = 0;
gap[1000] = 1;

В чем разница между тем, сколько памяти использует каждая переменная (noGap vs gap)? Я вижу из журнала консоли Chrome, что gap имеет более широкую длину, потому что он регистрирует (1001) [0, undefined × 999, 1].

Но если переменная gap действительно использует больше пространства, мне интересно знать, пропорциональна ли она числу undefined которые существуют в массиве, или если они постоянны.

Простите меня, если это повторяющийся вопрос. Это самый близкий ответ, который я нашел, но я не мог полностью понять ответ.

Теги:
arrays
memory
undefined

1 ответ

0

В V8 существует большая разница, длинный и разреженный массив занимает больше памяти. Однако это частично потому, что 1000 находится вблизи границы, после которой V8 меняет свое внутреннее представление разреженных массивов. Даже более длинный разреженный массив, вероятно, займет примерно столько же памяти.

Я только немного собрал доказательства с помощью инструментов Chrome dev (проверьте вкладку памяти), но вот он. Каждая строка в этой таблице представляет собой массив с записью с индексом 0, а другой в конце для определения его длины.

| sparse array length | retained size |
|---------------------|---------------|
| 1                   | 56            |
| 10                  | 304           |
| 1000                | 12,184        |
| 2000                | 184           |
| 3000                | 184           |
| 3000, less sparse   | 472           |

Обратите внимание, что память масштабируется с длиной до 1000, но в 2000 году она намного меньше, и она масштабируется с количеством заданных индексов.

Я предполагаю, что это связано с тем, что V8 переключается с полного представления всех значений от индексов 0 до length (в случае длины 1000) на хэш-карту, которая имеет только записи для индексов, которые были установлены.

У меня нет официальных знаний о том, как это работает, FYI.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню