2015-04-12 5 views
3

В первом примере я создал пустой массив длины 1000:Почему итерацию по массиву с размером быстрее

var arr = new Array(1000); 

for (var i = 0; i < arr.length; i++) 
    arr[i] = i; 

Во втором примере создается пустой массив длины 0:

var arr = []; 

for (var i = 0; i < 1000; i++) 
    arr.push(i); 

тестирования в Chrome 41.0. 2272.118 на OS X 10.10.3, а первый блок работает быстрее. Зачем? Потому что JavaScript-движок знает размер массива?

Benchmark здесь http://jsperf.com/poerttest/2.

ответ

6

Если вы не укажете размер массива, ему будет необходимо выделить больше места. Но если вы укажете размер в начале, он выделяет только один раз.

+0

Как ваша теория объясняет http://jsperf.com/poerttest/6? не будет ли случай 3 быстрее, чем случай 2, если перераспределение объясняет различия в производительности? ваша теория имеет смысл, я просто не уверен, что это правда в V8. – dandavis

+2

@dandavis второй и третий пример такие же, потому что размер массива в третьем примере - 2000. – wanillsky

+0

хороший глаз, я нахожусь перед моим сном;) – dandavis

0

Да. Когда вы выделяете размер, интерпретатор знает, что он выделил только 1000 элементов памяти/пространства. Итак, когда вы вставляете элемент, это всего лишь одна операция. Но когда вы объявляете динамический массив, второй сценарий вашего дела, интерпретатор должен увеличить размер массива, а затем нажать элемент. Это 2 операции!

0

Другой возможностью могло быть то, что push() дороже, чем назначение фиксированной позиции. Но тесты показывают, что это не так.

Что происходит, так это то, что пустые массивы получают относительно небольшую начальную емкость (либо хэш-пул, либо фактический массив), и увеличение этого пула дорого. Вы можете видеть, что, пытаясь с меньшими размерами: на 100 элементах, разница в производительности между Array(100) и [] исчезает.

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