Существуют ли идеальные размеры массива в JavaScript?

Я видел небольшие утилиты на разных языках, которые для требуемой емкости массива будут вычислять "идеальный размер" для массива. Эти подпрограммы обычно используются, когда для выделенного массива все равно, чем емкость. Они обычно работают путем вычисления длины массива, так что размер выделенного блока (в байтах) плюс служебные данные распределения памяти - это наименьшая точная мощность 2, необходимая для заданной емкости. В зависимости от схемы управления памятью это может значительно уменьшить фрагментацию памяти по мере выделения блоков памяти и затем освобождения.

JavaScript позволяет строить массивы с предопределенной длиной. Соответствует ли концепция "идеального размера" ? Я могу думать о четырех аргументах против него (в определенном порядке):

  • Системы управления памятью JS работают таким образом, чтобы не использовать такую ​​стратегию.
  • JS-механизмы уже внедряют такую ​​стратегию калибровки
  • JS двигатели действительно не держат массивы в качестве непрерывных блоков памяти, так что вся идея спорна (для типизированных массивов, за исключением)
  • Идея применяется, но управление памятью настолько зависит от двигателя, что ни одна стратегия "идеального размера" не будет работоспособной.

С другой стороны, возможно, все эти аргументы ошибочны, и небольшая утилита действительно будет эффективной (как в: сделать измеримую разницу в производительности script).

Итак: Можно ли написать эффективную процедуру "идеального размера" для массивов JavaScript?

Ответы

Ответ 1

Массивы в javascript находятся в их основных объектах. Они просто действуют как массивы через api. Инициализация массива аргументом просто задает свойство length с этим значением.

Если единственным аргументом, переданным конструктору Array, является целое число от 0 до 232-1 (включительно), это возвращает новый массив JavaScript с длиной, установленной для этого числа. - Array MDN

Кроме того, нет массива "Тип". Массив - это тип объекта. Таким образом, Array Object ecma 5.1.

В результате не будет различий в использовании памяти между использованием

var one = new Array();
var two = new Array(1000);

кроме свойства length. При проверке в цикле с использованием хронологической шкалы хрома это также проверяет. Создание 1000 из каждого из них приводит к примерно 2,2 МБ распределения на моей машине.

один

два enter image description here

Ответ 2

Вам придется измерять производительность, потому что слишком много движущихся частей. VM и движок и браузер. Затем виртуальная память (платформа windows/linux, физическая доступная память и устройства хранения данных HD/SSD). И, очевидно, текущая загрузка (наличие других веб-страниц или серверных, других приложений).

Я вижу мало пользы в таких усилиях. Любой идеальный размер для производительности может быть просто не идеальным, когда другая вкладка загружается в браузере или страница загружается на другую машину.

Лучшая вещь, которую я вижу здесь для улучшения, - это время разработки, меньше писать и быстрее развертывать ваш сайт.