#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, и я бы выбрал способ цикла, чтобы быть более надежным в будущем.
Много лет назад я тратил много времени на оптимизацию кода, не заслуживающего внимания, что приводило к тому, что грязную кодовую базу было сложнее поддерживать. Сейчас я часто вспоминаю себе следующую цитату:
преждевременная оптимизация — корень всех зол