Влияет ли размер объекта / массива javascript на время доступа или изменения части данных в объекте? - PullRequest
1 голос
/ 13 июля 2020

Я хотел бы знать, происходит ли добавление или доступ к данным в большом объекте / массиве медленнее, чем в небольшом объекте / массиве.

Например, если у меня есть объект / массив с 50000 элементами и я хотел бы изменить или получить к нему доступ, будет ли это медленнее, чем объект / массив меньшего размера, содержащий всего 500 элементов? Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Доступ к одному элементу массива или свойству объекта займет примерно одинаковое время независимо от размера.

Добавление данных будет отличаться в зависимости от того, о чем мы говорим. массив или объект, не являющийся массивом, и где и как вы добавляете данные.

Я не могу говорить о специфике какого-либо конкретного механизма JavaScript, но обычно реализации массивов переменной длины имеют две разные длины : выделенная длина и текущая длина. Свойство array.length, которое вы видите в JavaScript, - это текущая длина, но память, выделенная для массива, часто больше этого. Например, массив из 100 элементов может фактически выделить достаточно места для 128 элементов.

Поэтому, когда вы вызываете array.push(), в данных массива уже может быть дополнительное место. Это дело очень быстрое. Коду нужно только увеличить .length и сохранить новый элемент массива.

Это причина выделения места для большего количества элементов, чем текущая длина: чтобы избежать необходимости перераспределять память на каждые .push().

Однако, как только текущая длина достигает выделенной длины, следующая .push() должна перераспределить весь массив и обычно должна скопировать все предыдущие элементы массива в новую ячейку памяти. Это делает этот конкретный .push() намного медленнее. Однако последующие вызовы .push() будут быстрыми, пока текущая длина снова не достигнет выделенной длины.

В некоторых случаях перераспределение может происходить на месте - может случиться, что нераспределенное пространство окажется сразу после окончания массив, поэтому он может расширяться без копирования, но это менее распространенный случай. на 1,5 или как угодно.

А что, если вы используете array.unshift() или array.splice() для вставки одного или нескольких элементов в начало массива или рядом с ним? В этом случае, даже если в выделенной длине массива есть место для дополнительных элементов, скорость будет зависеть от текущей длины массива, потому что все существующие элементы после точки вставки должны быть перемещены в память.

Это меньше фактор для объекта, не являющегося массивом. Добавление нового свойства, независимо от его ключевого значения, не требует перемещения всех существующих свойств. Это может быть несколько медленнее для объекта с большим количеством свойств, но не так, как добавление элементов в начале массива. Объекты реализованы с помощью таблицы ha sh или аналогичной структуры данных. Механизм может решить перераспределить таблицу ha sh, чтобы увеличить ее, когда существует слишком много конфликтов ha sh (ключи, которые сопоставляются с одним и тем же значением ha sh), но это будет примерно таким же, какое бы значение ключа вы добавляете. Здесь не имеет значения, является ли ключ «меньше» или «больше» любого из существующих значений.

Если у вас есть дополнительные c вопросы, мы можем их продолжить.

0 голосов
/ 13 июля 2020

Если вам нужно, чтобы final содержимое массива находилось в некоторой определенной c последовательности, тогда безусловно самое быстрое, что нужно сделать, это сначала собрать массив в любую последовательность, затем отсортируйте массив в окончательную последовательность, которая вам нужна.

«Сортировка» на любом современном языке - это так называемая операция O(log(n)), которая означает, что его производительность в наихудшем случае «порядка» некоторого логарифма количества элементов, что «чертовски хорошо». Если затем вам нужно добавить дополнительные элементы в отсортированный массив, просто добавьте элементы в конец, а затем выполните повторную сортировку.

NB:"Наборы данных, которые, как известно, отсортированы определенным образом «использовались с большим успехом буквально « до появления компьютеров », во времена перфокарт

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...