В чем разница между while(true) и for(;;) в PHP?
есть ли разница в PHP между тегами while(true)
и for(;;)
помимо синтаксиса и читаемости?
Edit: я бы не считал это дубликатом - я хочу знать ответ, специфичный для PHP. Есть ли реальная разница в том, что касается двигателя? Составляют ли они одно и то же? Имеют ли они равную производительность?
Edit 2: я бы также не считал, что относительная производительность и связанные с ней Коды операций основаны на мнении. Существует возможность для заключения в читаемость, но это явно не вопрос.
1 ответов
Итак, во-первых, позвольте мне сказать следующее: использовать while(true)
, так как это придает самое смысловое значение. Вам нужно разобрать for (;;)
как это не то, что вы видите часто.
С учетом сказанного, давайте проанализируем:
Opcodes
код
while(true) {
break;
}
echo "hi!";
компилируется вплоть до опкодов:
0: JMPZ(true, 3)
1: BRK(1, 3)
2: JMP(0)
3: ECHO("hi!")
таким образом, в основном, он проверяет, "true", а если нет, переходит к 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
, если условие ложно.
JMP (позиция)
этот код операции всегда переходит к коду операции в указанной позиции.
BRK (уровень, положение)
это ломает level
уровни к операции на position
Эхо(строка)
выводит строку
Они Одинаковые
ну, глядя на коды операций, ясно, что они не идентичны. Они ==
, но не ===
. The while(true)
цикл делает условный прыжок, за которым следует код, а затем безусловный прыжок. The 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!")
это потому, что оптимизатор найдет и оптимизирует прыжковые цепи. Поэтому, если вы используете встроенный opcache 5.5, они будут идентичный...
осторожностью
это полная и полная микро-оптимизация для принятия решения. Используйте читаемый. Не используйте его на основе производительности. Разница есть, но она тривиальна.