Производительность цикла Javascript

1

Скажем, нам нужно проверить пользователей 1 м, как это сделать?

for (var i = 0;i<1000000;i++){
    users[i].abc();
    users[i].abc2();
} 

или же

for (var i = 0;i<1000000;i++){
    var user = users[i];
    user.abc();
    user.abc2();
} 

Какой из них будет быстрее и почему?

  • 4
    Разница была бы незначительной.
  • 0
    версия с temp идет быстрее из-за меньшего использования метода доступа к свойствам.
Показать ещё 3 комментария
Теги:
for-loop
loops

3 ответа

1
Лучший ответ

Второй цикл составляет около 20% -30% быстрее. См. Результаты фрагмента ниже. Т.е. создание ссылки занимает меньше времени, чем адресация по индексу в массиве.

var users = [];

for (var i = 0;i<1000000;i++){
    users.push({abc: function() {}, abc2: function() {}});
}

var now = new Date();

for (var i = 0;i<1000000;i++){
    users[i].abc();
    users[i].abc2();
}

console.log('The first loop requires ' + (new Date().getTime() - now.getTime()) + 'ms');
now = new Date();

for (var i = 0;i<1000000;i++){
    var user = users[i];
    user.abc();
    user.abc2();
}

console.log('The second loop requires ' + (new Date().getTime() - now.getTime()) + 'ms');
  • 0
    Это неверно, причина, по которой второй цикл намного быстрее, в том, что двигатель уже «прогрелся» во втором цикле. Поменяйте местами циклы, сначала установите нижний, и вы все равно получите тот же результат, он не имеет ничего общего с переменными, просто разница настолько незначительна, что прогреваемый двигатель имеет такое большое значение.
  • 0
    Вот пример, который, по крайней мере, чуть более точен -> jsfiddle.net/adeneo/9pt8pkgc , желательно использовать jsperf.com/for-loop-333 для такого рода вещей.
0

Согласно https://en.wikipedia.org/wiki/Chrome_V8 компилятор v8 скомпилирует ваш код на собственный машинный код.

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

Как указано в других ответах, разница, если таковая имеется, не будет иметь значения.

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

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

Я бы сказал, что если вы запускаете много users[i] то разыменование локальной user переменной в порядке, потому что в конечном итоге это сохраняет символы, которые вы набираете ("s[i]")

Если вы запустили только одного или двух users[i] тогда оставайтесь с этим, потому что разыменование будет использовать только больше кодов линий.

Короче говоря, я бы выбрал более компактный код.


ОБНОВИТЬ:

Я попробовал код Александра Элгина, и он показывает огромные различия в локальном исполнении с 50% до 20% прироста скорости, поэтому он не "не имеет значения", как я или другие заявил (+1 для него)

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

0

Loop version 1 будет работать медленнее, но будет меньше использования памяти. Причина в том, что он обращается к вашему массиву с итератором i 2 раза за итерацию цикла.

Loop version 2 будет работать быстрее, но будет потреблять больше памяти. Причина в том, что он обращается к массиву только один раз за итерацию цикла, но создает экземпляр переменной (user).

Сказав это, обе версии очень похожи, и все различия в производительности/использовании памяти в основном несущественны.

  • 0
    использование памяти незначительно.
  • 0
    @NinaScholz Все в этом вопросе ничтожно мало, но я думаю, у ОП есть причина спрашивать ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню