В чем разница между 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, они будут идентичный...

осторожностью

это полная и полная микро-оптимизация для принятия решения. Используйте читаемый. Не используйте его на основе производительности. Разница есть, но она тривиальна.