Скажем, нам нужно проверить пользователей 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();
}
Какой из них будет быстрее и почему?
Второй цикл составляет около 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');
Согласно https://en.wikipedia.org/wiki/Chrome_V8 компилятор v8 скомпилирует ваш код на собственный машинный код.
В зависимости от оптимизаций, сделанных компилятором, у вас нет точного способа гарантировать, какая версия будет быстрее.
Как указано в других ответах, разница, если таковая имеется, не будет иметь значения.
Скомпилированный код дополнительно оптимизируется (и повторно оптимизируется) динамически во время выполнения на основе эвристики профиля выполнения кода. Используемые методы оптимизации включают в себя вложение, исключение дорогостоящих свойств времени выполнения и встроенное кэширование, среди многих других.
Таким образом, точки, которые необходимо учитывать для вашего случая, не основаны на скорости выполнения.
Я бы сказал, что если вы запускаете много users[i]
то разыменование локальной user
переменной в порядке, потому что в конечном итоге это сохраняет символы, которые вы набираете ("s[i]"
)
Если вы запустили только одного или двух users[i]
тогда оставайтесь с этим, потому что разыменование будет использовать только больше кодов линий.
Короче говоря, я бы выбрал более компактный код.
ОБНОВИТЬ:
Я попробовал код Александра Элгина, и он показывает огромные различия в локальном исполнении с 50% до 20% прироста скорости, поэтому он не "не имеет значения", как я или другие заявил (+1 для него)
Но я настаиваю на том, что все зависит от оптимизаций, выполняемых механизмом выполнения, но действительно на моей версии nodejs, разыменование происходит намного быстрее на огромных циклах.
Loop version 1 будет работать медленнее, но будет меньше использования памяти. Причина в том, что он обращается к вашему массиву с итератором i
2 раза за итерацию цикла.
Loop version 2 будет работать быстрее, но будет потреблять больше памяти. Причина в том, что он обращается к массиву только один раз за итерацию цикла, но создает экземпляр переменной (user
).
Сказав это, обе версии очень похожи, и все различия в производительности/использовании памяти в основном несущественны.
temp
идет быстрее из-за меньшего использования метода доступа к свойствам.