Ответ 1
Итак, позвольте мне сказать следующее: Использовать while(true)
, поскольку он дает самое смысловое значение. Вам нужно разобрать for (;;)
, поскольку это не то, что вы часто видите.
С учетом сказанного проанализируем:
Opcodes
Код
while(true) {
break;
}
echo "hi!";
Скомпилируется до кодов операций:
0: JMPZ(true, 3)
1: BRK(1, 3)
2: JMP(0)
3: ECHO("hi!")
Итак, в основном, он проверяет, действительно ли "истина", а если нет, перескакивает на 4-й код операции, который является кодом операции эха). Затем он ломается (это действительно просто статический переход к 4-му опкоду). Тогда конец цикла будет безусловным переходом к первоначальной проверке
Сравните это с:
for (;;) {
break;
}
echo "hi!";
Скомпилируется до:
0: JMPZNZ(true, 2, 4)
1: JMP(0)
2: BRK(1, 4)
3: JMP(1)
4: ECHO("hi!")
Итак, мы можем сразу увидеть, что в версии for(;;)
есть дополнительный код операции.
Определения кода опций
JMPZ (условие, положение)
Этот код операции перескакивает, если условие false
. Если это true
, он ничего не делает, кроме продвижения одного кода операции.
JMPZNZ (условие, pos1, pos2)
Этот код операции переходит в pos1
, если условие истинно, и pos2
, если условие ложно.
СПМ (положение)
Этот код операции всегда переходит к коду операции в указанной позиции.
BRK (уровень, положение)
Это разбивает уровни level
на код операции в position
ЭХО (строка)
Выводит строку
Они одинаковы
Хорошо, глядя на коды операций, ясно, что они не идентичны. Они ==
, но не ===
. Цикл while(true)
выполняет условный переход, за которым следует код, за которым следует безусловный переход. Цикл for(;;)
выполняет условный переход, за которым следует код, за которым следует безусловный переход, за которым следует еще один безусловный переход. Таким образом, он делает дополнительный прыжок.
Opcache
В 5.5 часть оптимизатора opcache будет оптимизировать статические условные переходы.
Таким образом, код while(true)
будет оптимизирован до:
0: BRK(1, 2)
1: JMP(0)
2: ECHO("hi!")
И цикл for(;;)
будет выглядеть следующим образом:
0: BRK(1, 2)
1: JMP(0)
2: ECHO("hi!")
Это связано с тем, что оптимизатор найдет и оптимизирует цепи перехода. Поэтому, если вы используете 5.5 встроенный opcache, они будут идентичны...
Внимание!
Это полная и полная микро-оптимизация для принятия решения. Используйте читаемый. Не используйте его в зависимости от производительности. Разница есть, но это тривиально.