Я запустил этот код и получил следующий результат. Мне интересно узнать, почему []
это быстрее?
console.time('using[]')
for(var i=0; i<200000; i++){var arr = []};
console.timeEnd('using[]')
console.time('using new')
for(var i=0; i<200000; i++){var arr = new Array};
console.timeEnd('using new')
- используя
[]
: 299ms - используя
new
: 363ms
Благодаря Raynos, здесь есть эталон этого кода и еще один возможный способ определения переменной.
javascript
performance
Мохсен
источник
источник
[]
это эквивалентно сnew Array()
точки зрения исходного кода, а не объектов, возвращаемых выражений формыОтветы:
Более подробно о предыдущих ответах ...
С точки зрения общих компиляторов и без учета специфичных для ВМ оптимизаций:
Сначала мы проходим через фазу лексического анализа, где мы токенизируем код.
Например, могут быть получены следующие токены:
Надеюсь, это обеспечит вам достаточную визуализацию, чтобы вы могли понять, насколько требуется больше (или меньше) обработки.
Основываясь на вышеупомянутых токенах, мы знаем, что ARRAY_INIT всегда будет создавать массив. Поэтому мы просто создаем массив и заполняем его. Что касается неоднозначности, то на этапе лексического анализа ARRAY_INIT уже отличается от средства доступа к свойству объекта (например
obj[foo]
) или скобок внутри строк / литералов регулярных выражений (например, "foo [] bar" или / [] /)Это незначительно, но у нас также есть больше жетонов
new Array
. Кроме того, еще не совсем ясно, что мы просто хотим создать массив. Мы видим «новый» токен, но «новый» что? Затем мы видим токен IDENTIFIER, который означает, что мы хотим новый «массив», но виртуальные машины JavaScript обычно не различают токен IDENTIFIER и токены для «нативных глобальных объектов». Следовательно...Мы должны искать цепочку областей действия каждый раз, когда встречаем токен IDENTIFIER. Виртуальные машины Javascript содержат «объект активации» для каждого контекста выполнения, который может содержать объект «аргументы», локально определенные переменные и т. Д. Если мы не можем найти его в объекте активации, мы начинаем искать цепочку областей действия, пока не достигнем глобальной области видимости. , Если ничего не найдено, мы бросаем
ReferenceError
.Как только мы нашли объявление переменной, мы вызываем конструктор.
new Array
является неявным вызовом функции, и практическое правило заключается в том, что вызовы функций медленнее во время выполнения (следовательно, почему статические компиляторы C / C ++ допускают «встраивание функций» - какие механизмы JS JIT, такие как SpiderMonkey, должны выполнять «на лету»)Array
Конструктор перегружен. Конструктор Array реализован в виде нативного кода, поэтому он обеспечивает некоторые улучшения производительности, но ему все равно необходимо проверить длину аргументов и действовать соответствующим образом. Более того, если указан только один аргумент, нам необходимо дополнительно проверить тип аргумента. new Array ("foo") создает ["foo"], где new Array (1) создает [undefined]Итак, чтобы упростить все это: с литералами массива, VM знает, что мы хотим массив; с
new Array
, виртуальная машина должна использовать дополнительные циклы процессора, чтобы выяснить, что наnew Array
самом деле делает.источник
Одна из возможных причин заключается в том, что
new Array
требуется поиск имениArray
(у вас может быть переменная с этим именем в области видимости), тогда как[]
это не так.источник
Array
исключает как один аргумент, такlen
и несколько аргументов. Где как[]
принимает только несколько аргументов. Также тесты Firefox не показывают почти никакой разницы.var Array = window.Array
повышает производительностьnew Array
теста.Хороший вопрос. Первый пример называется литералом массива. Это предпочтительный способ создания массивов среди многих разработчиков. Возможно, разница в производительности вызвана проверкой аргументов нового вызова Array () и созданием объекта, в то время как литерал создает массив напрямую.
Относительно небольшая разница в производительности подтверждает эту точку зрения. Кстати, вы можете сделать такой же тест с Object и object literal {}.
источник
Это имело бы какой-то смысл
http://www.dyn-web.com/tutorials/obj_lit.php
источник
Также интересно, что если длина массива известна заранее (элементы будут добавлены сразу после создания), использование конструктора массива указанной длины намного быстрее в недавнем Google Chrome 70+.
" новый массив ( % ARR_LENGTH% ) " - 100% (быстрее) !
« [] » - 160-170% (медленнее)
Тест можно найти здесь - https://jsperf.com/small-arr-init-with-known-length-brackets-vs-new-array/2
Примечание: этот результат проверен на Google Chrome v.70 + ; в Firefox v.70 и IE оба варианта практически равны.
источник