2014-12-22 5 views
3

Я знаю, что в браузере это более оптимально написать цикл вдоль линийNodeJS для оптимизации контура

for(var i=0, l=arr.length; i<l; i++){ } 

вместо

for(var i=0; i<arr.length; i++){ } 

Но это верно в NodeJS или делает Двигатель V8 оптимизирует его?

Я знаю, что в ecma-262 5.1 sec-15.4 длины массива определяется как, например:

Значение свойства длины численно больше, чем имя каждого свойства, имя которого является индексом массива; когда свойство объекта Array создается или изменяется, другие свойства корректируются по мере необходимости для поддержания этого инварианта.

Таким образом, если длина не изменяется, единственная причина, по которой этот метод будет медленнее, заключается в том, что вам нужно получить доступ к свойству. То, что я ищу, является разумным примером/объяснением, которое показывает, влияет ли двигатель V8 (который используется в NodeJS) на производительность при доступе к этому свойству.

+0

говорить о микро-оптимизации ... –

+0

Я думаю, что нет оптимизации, потому что это утверждение, которое нужно проверять каждый цикл – Hacketo

+0

@AmitJoki, это правда, это микро-оптимизация, но я лучше буду спать ночью, зная ответ :) –

ответ

3

Если arr - это чистая локальная переменная, и петля никак не трогает ее, то да. Однако даже если оптимизация не удалась, загрузка одного и того же поля снова и снова не стоит ничего из-за кэша ЦП.

+3

«Не стоит ничего стоить ничего» - для «малых» значений '.length' ... – Alnitak

+0

@Alnitak Не имеет значения, насколько он большой или малый, он хранится в 12/24 байтах от указателя массива, который подходит для всех строк кэша CPU – Esailija

+0

, если JIT достаточно умен, чтобы выполнить эту оптимизацию для объекта массива, а также оптимизировать доступ к свойствам.Моим аргументом было бы, если бы вы знали, что длина цикла не изменяется, то _why not_ писать цикл таким образом и позволить даже самому тупому интерпретатору JS использовать инвариант. – Alnitak

1

Проблема заключается в вычислении длины. В этом примере for(var i=0; i<arr.length; i++){ } инструкция arr.length будет рассчитана на каждой итерации цикла. Но с for(var i=0, l=arr.length; i<l; i++){ } значение будет принято без каких-либо расчетов. Просто получение значения быстрее, чем вычисление длины массива.
Получение длины не может быть оптимизировано каким-либо компилятором, потому что ее можно было бы изменить. Таким образом, вычисляется каждая итерация.

2

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

Даже если это не быстрее (хотя http://jsperf.com/array-length-vs-cached предлагает это на самом деле), это просто хорошая практика для выражения постоянных выражений из-за пределов цикла.

+0

Да, так что усиление хромированной характеристики указывает на то, что он также будет быстрее на двигателе NodeJS V8? Так как это мой конкретный вариант использования. –

+0

Если Chrome все еще использует V8 (ISTR это?), То результаты от Chrome _should_ экстраполируются на V8. – Alnitak

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