Друг просматривал в последний пост , и он два вопроса об этом фрагменте кода JavaScript:
var entityIndex = entities.length - 1; for (; entityIndex != 0; entityIndex--) { entities[entityIndex].draw(ctx); }
- Почему я инициализирую
entityIndex
вне цикла? - Почему я сравниваю
entityIndex
с 0?
Инициализация снаружи
Ответ на первый вопрос на самом деле просто личная читабельность (ну, может быть, небольшой штрих «это заставит людей задуматься»).
Давайте немного углубимся в конструкцию. Объявление for
цикла состоит из трех выражений. (Я не говорю for(in)
здесь.)
Первое выражение является инициализатором; это выполняется только один раз. Это обычно что-то вроде var i = 0
. Это выражение все еще подлежит подъему .
Второе выражение является условным. Это выполнено по крайней мере один раз.
Третье выражение изменяет состояние и выполняется один раз каждый раз, когда условие выполняется. (Здесь нет больших сюрпризов.)
В приведенном выше случае я инстинктивно чувствовал, что в одной строке слишком много текста, поэтому я переместил первое выражение за пределы for
. Это действительно оказывает влияние на способ выполнения кода и (поскольку переменная поднимается) на самом деле немного ближе к тому, что действительно делает интерпретатор.
По сравнению с нулем
Я решил использовать entityIndex != 0
не потому, что хотел сравнить с нулем, а потому, что хотел избежать затрат на entities.length
повторную оценку . Поскольку второе выражение вычисляется снова и снова, мы не хотим делать там что-нибудь дорогое. Если бы у нас entities
было много участников, то расчет length
мог оказать существенное влияние.
Есть некоторый вопрос об относительной производительности > 0
против != 0
, однако результаты теста для этого, кажется, указывают, что это не имеет значения.
Заключительные мысли
- О оптимизациях легко зацикливаться, но важно понимать, что многие микрооптимизации зависят от браузера. Так что тестируйте, тестируйте, тестируйте, прежде чем тратить на это время.
- Я сделал одно изменение, потому что оно было более читабельным для меня . Это может быть не так для вас. Если так, не делай этого.
Рекомендации