Какой из них более эффективен — для цикла против оператора if

#javascript #performance #for-loop #if-statement #logical-operators

#javascript #Производительность #для цикла #if-statement #логические операторы

Вопрос:

Было бы эффективнее искать что-то через небольшой цикл таблицы (в таблице от 1 до 3 записей) или путем проверки 2-й таблицы с if помощью оператора (эта таблица намного больше и может содержать сотни записей).).

Цикл через таблицу:

 for (var i = 0; i < TableA.length; i  ) {
    if (TableA[i].x1 < x amp;amp; TableA[i].x2 < x amp;amp; TableA[i].y1 < y amp;amp; TableA[i].y2 < y then) {
        // process ..
        break;
    }
}
 

оператор if:

 if (tableB[x][y] == true) {
    // process ..
}
 

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

Комментарии:

1. Какой язык вы рассматриваете?

2. Я бы вообще пошел по пути цикла, так как это более чистый IMO и доказательство на будущее, если содержимое tableA увеличивается.

3. Привет, спасибо за ввод. Я работаю на узловом js-сервере. Я использую это в 2d-игре, чтобы проверить, находятся ли игроки в определенной области, когда начинается определенное событие.

4. @helvete, также благодарю вас за предложение по редактированию. Я также заставил меня заметить ошибку в операторе if внутри цикла for.

5. Что быстрее?

Ответ №1:

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

Оператор if — это O (1), а таблица цикла — O (n), но, как вы уже сказали, n действительно мало (от 1 до 3), поэтому трудно сказать, какая версия быстрее.

Это во многом зависит от размера TableB: если таблица очень большая, она может не поместиться в CPU-cache, поэтому доступ может включать чтение через RAM (или более медленный CPU-cache), и пока код все еще равен O (1), доступ к памятидоминирует время вычисления. С другой стороны, TableA мал, а арифметические операции, выполняемые в операторе if, достаточно просты, что может быть пренебрежимо для производительности процессора (в зависимости от архитектуры процессора).

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

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

преждевременная оптимизация — корень всех зол