44 votes

Quelle est la difference entre while (true) et for (;;) en PHP?

Quelle est la différence en PHP entre while(true) et for(;;) en plus de la syntaxe et de la lisibilité?

Edit: je n'y verrait pas un doublon, je veux savoir la réponse spécifique à PHP. Est-il une réelle différence dans la mesure où le moteur est concerné? Faire la compilation de la même chose? Ont-ils le même rendement?

Edit 2: j'ai aussi de ne pas considérer la performance relative et associés OpCodes être fondée sur une opinion. Il est possible pour avis de la lisibilité mais ce n'est pas explicitement la question.

94voto

ircmaxell Points 74865

Ok, donc tout d'abord, permettez-moi de dire ceci: Utiliser while(true),, car il donne le plus de sens sémantique. Vous devez analyser for (;;) que ce n'est pas quelque chose que vous voyez souvent.

Avec cela dit, nous allons analyser:

Opcodes

Le code

while(true) {
    break;
}
echo "hi!";

Compile vers le bas pour les opcodes:

0: JMPZ(true, 3)
1: BRK(1, 3)
2: JMP(0)
3: ECHO("hi!")

Donc, fondamentalement, il effectue une vérification si "true", et si non, passe à la 4ème opcode qui est l'écho de l'opcode). Puis il se casse (ce qui est vraiment juste un saut statique à la 4ème opcode). Puis la fin de la boucle serait une inconditionnelle de revenir à la vérification d'origine

Comparez-la à:

for (;;) {
    break;
}
echo "hi!";

Compile vers:

0: JMPZNZ(true, 2, 4)
1: JMP(0)
2: BRK(1, 4)
3: JMP(1)
4: ECHO("hi!")

Donc, nous pouvons immédiatement voir qu'il y a un supplément de opcode dans l' for(;;) version.

Opcode Définitions

JMPZ(état de santé, position)

Cet opcode sauts si la condition est - false. Si c'est true, il ne fait rien, mais avance un opcode.

JMPZNZ(état de santé, pos1, pos2=)

Cet opcode sauts d' pos1 si la condition est vraie, et pos2 si la condition est fausse.

JMP(position)

Cet opcode saute toujours à l'opcode à la position spécifiée.

BRK(niveau, position)

Cela rompt level niveaux de l'opcode en position

ECHO(string)

Les sorties de la chaîne

Sont-Ils Les Mêmes

Eh bien, en regardant les opcodes, il est clair qu'ils ne sont pas identiques. Le sont - ==, mais pas ===. L' while(true) boucle fait un saut conditionnel, suivi par le code de suivi d'un saut inconditionnel. L' for(;;) boucle fait un saut conditionnel, suivi par code, suivi par un saut inconditionnel, suivi par un autre inconditionnel de saut. Donc, il ne un supplément de sauter.

Opcache

En 5.5, l'Optimiseur partie de opcache permettra d' optimiser statique conditionnelle sauts.

Donc cela signifie que l' while(true) code permettra d'optimiser le bas pour:

0: BRK(1, 2)
1: JMP(0)
2: ECHO("hi!")

Et for(;;) boucle devient:

0: BRK(1, 2)
1: JMP(0)
2: ECHO("hi!")

C'est parce que l'optimiseur de trouver et optimze saut de chaînes. Ainsi, si vous utilisez 5.5 intégré dans opcache, ils seront identiques...

Attention

C'est une complète et totale de la micro-optimisation de fonder une décision sur. Utiliser le lisible par un. Ne pas utiliser l'un basé sur la performance. La différence est là, mais c'est trivial.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X