В чем разница между while (true) и for (;;) в PHP?

Есть ли разница в PHP между while(true) и for(;;) помимо синтаксиса и удобочитаемости?

Изменить: я бы не счел это дубликат - я хочу знать ответ, специфичный для PHP. Есть ли какая-то реальная разница в отношении двигателя? Соединяют ли они то же самое? Имеют ли они равную производительность?

Изменить 2: я также не считаю относительную производительность и связанные с ней OpCodes основаны на мнении. В читаемости есть возможность для мнения, но это явно не вопрос.

+40
07 апр. '14 в 14:53
источник поделиться
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, они будут идентичны...

Внимание!

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

+89
07 апр. '14 в 15:54
источник

Посмотрите другие вопросы по меткам или Задайте вопрос