Array for -l oop: временно сохранить Array [i] или продолжать вызывать Array [i]? Что лучше / быстрее? - PullRequest
1 голос
/ 23 февраля 2020

Я пытаюсь выяснить, нужно ли мне временно скопировать элемент массива, пока я работаю с ним внутри for-l oop. Есть ли разница в производительности? Кроме того, чтобы сделать код более читабельным. (JavaScript)

var max = someArray.length;
for (var i = 0; i < max; i++) {
   // Here I will use someArray[i] quite often. Like this:
   if (someArray[i].position.y > blabla) {
       //...
   }
}

ИЛИ:

var max = someArray.length;
for (var i = 0; i < max; i++) {
   var tmp = someArray[i]; // <---- CHANGE
   // Here I will use tmp quite often. Like this:
   if (tmp.position.y > blabla) {
       //...
   }
}

1 Ответ

2 голосов
/ 23 февраля 2020

Предостережение: Беспокойство по поводу производительности, когда у тебя есть проблема с c, о которой стоит беспокоиться. А пока пишите все, что кажется вам ясным и наименее подверженным ошибкам для вас и вашей команды. В 99,999999% случаев конкретная c производительность данного l oop просто не будет иметь значения в реальном мире.

С учетом сказанного:

С современным JavaScript Я бы, вероятно, вместо этого использовал бы for-of l oop (ES2015 +):

for (const entry of someArray) {
    if (entry.position.y > blabla) {
        // ...
    }
}

Теоретически, он использует закулисный итератор, который включает вызовы функций; на практике вполне вероятно, что если вы имеете дело с реальным массивом, и этот массив использует стандартный итератор, механизм JavaScript сможет оптимизировать l oop, если l oop является горячей точкой (и если это не так, об этом не стоит беспокоиться).

Относительно ваших двух альтернатив, если i и someArray не меняются в l oop и someArray - это просто нормальное В массиве двигатель JavaScript, вероятно, сможет оптимизировать его до уровня, подобного вашему второму l oop. Что касается стиля, до for-of я всегда использовал локальное значение внутри l oop вместо того, чтобы каждый раз набирать someArray[i], но это только потому, что легче набрать tmp (или более значимое имя), чем someArray[i].

Если есть причина полагать, что спецификация c l oop является медленной (поэтому по какой-то причине она не оптимизируется), тогда я мог бы go с чем-то вроде вашего второй пример:

for (let i = 0, max = someArray.length; i < max; i++) {
   const tmp = someArray[i];
   if (tmp.position.y > blabla) {
       //...
   }
}

Но опять же , это в основном вопрос стиля до тех пор, пока у вас не возникнет конкретная c проблема производительности, которую вы диагностируете и исправляете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...