2013-10-10 2 views
2

Я проходил тестовые чеки js-perf и нашел это http://jsperf.com/pre-allocated-arrays-2/2.Почему массив (99999) медленнее, чем Array (100000)

В результате массив (100000) быстрее, чем массив (99999). Почему так?

Edit:

Моих сомнений было там какой-либо конкретный алгоритм следовал при создании массивов во время выполнения. Даже когда я выполняю 99 против 100. 100 быстрее в моем браузере. Для того, чтобы получить представление об алгоритме если есть, я отвечал на этот вопрос

Браузер: Chrome OS 30.0.15 : Mac OSX

+1

Я не вижу никакого результата, который сказал бы, что один из них быстрее? –

+0

Каков ваш тест. код?? –

+1

Я также считаю, что разница настолько незначительна, что бенчмарк может не дать правильного результата. – VisioN

ответ

3

Это технически не быстрее. Только результат ваших тестов вышел именно так.

Я тоже проверил тесты, а Array (99999) был на 0,11% быстрее, чем Array (100000). Запустите его снова, ничего не делая во время тестирования. Кстати, есть приближение - когда я бежал, он имел +/- 0,20%. Вот почему он мог взять немного больше, чтобы работать быстрее.

1

Некоторые реализации (в частности, Safari's Nitro) делают предварительную выделение памяти, когда Array constructor is called with a length, другие нет. Вероятно, 100k - это произвольно выбранный предел, в котором они переключаются на другое поведение.

+1

* «Некоторые реализации предопределяют память при вызове конструктора Array с длиной, другие - нет». * У вас есть доказательства этого? – VisioN

+0

@ Bergi Я даже наблюдал 100 быстрее, чем 99. Хотел знать, есть ли какое-либо изменение поведения для значений. И спасибо за ответ. – Exception

+0

@VisioN: http://coding.smashingmagazine.com/2012/11/05/writing-fast-memory-efficient-javascript/ ('Ctrl + F' pre-allocate) – Bergi

5

Этот инструмент не дает точных результатов% 100, так что он нормальный. Массив (100000) быстрее, чем Array (99999).

Мой Тест:http://jsperf.com/ideaferid

enter image description here

1

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

Я использовал эту систему тестирования и получил результаты:

enter image description here

их вы можете видеть, второй код были медленнее. В качестве вывода - это либо нестабильная тестовая система, либо недостаточно итераций для оценки значимого значения времени выполнения. Также обратите внимание, что, несмотря на то, что мой браузер не в Chrome, если причина была внутри js, это не имеет значения (в то время как мой результат очевиден)

+0

Поскольку разные браузеры используют разные JS-движки, это, вероятно, будет иметь значение, в каком браузере вы используете. – adamjc

3

Эта тайна связана с сборкой мусора.
Запуск первого теста создаст мусор - на самом деле много, поэтому сборщик мусора должен работать в определенное время, замедляя выполнение.
Второй тест будет страдать от мусора, созданного в первом, что делает его более вероятным, чем первое испытание будет медленнее.
Попробуйте поменять местами тесты, и вы увидите, что это первый выигрыш: вопрос касается не размера массива, а порядка проверки.

Мы видим здесь одно из смещений, вызванных jsperf, результаты которых всегда должны использоваться с предосторожностями.

я отменил заказ испытания здесь:
http://jsperf.com/pre-allocated-arrays-2/5
мы можем видеть, что "100K быстрее, чем 100K-1" ...если он находится на первом месте.

Смежные вопросы