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.