Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the difference between while(true) and for(;;) in PHP?

Is there any difference in PHP between while(true) and for(;;) besides syntax and readability?

like image 288
Alastair Avatar asked Apr 07 '14 14:04

Alastair


People also ask

What is the difference between for and while loop in PHP?

Loops in PHP are used to execute the same block of code a specified number of times. PHP supports following four loop types. for − loops through a block of code a specified number of times. while − loops through a block of code if and as long as a specified condition is true.

What is the difference between while and while true?

The while loop in python runs until the "while" condition is satisfied. The "while true" loop in python runs without any conditions until the break statement executes inside the loop.

Is for and while the same?

The 'for' loop used only when we already knew the number of iterations. The 'while' loop used only when the number of iteration are not exactly known. If the condition is not put up in 'for' loop, then loop iterates infinite times. If the condition is not put up in 'while' loop, it provides compilation error.

What is the use of while in PHP?

The while loop executes a block of code as long as the specified condition is true.


1 Answers

Ok, so first off, let me say this: Use while(true), as it gives the most semantic meaning. You need to parse for (;;) as it's not something you see often.

With that said, let's analyze:

Opcodes

The code

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

Compiles down to the opcodes:

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

So basically, it does a check if "true", and if not, jumps to the 4th opcode which is the echo opcode). Then it breaks (which is really just a static jump to the 4th opcode). Then the end of the loop would be an unconditional jump back to the original check

Compare that to:

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

Compiles down to:

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

So we can immediately see that there's an extra opcode in the for(;;) version.

Opcode Definitions

JMPZ(condition, position)

This opcode jumps if the condition is false. If it is true, it does nothing but advance one opcode.

JMPZNZ(condition, pos1, pos2)

This opcode jumps to pos1 if the condition is true, and pos2 if the condition is false.

JMP(position)

This opcode always jumps to the opcode at the specified position.

BRK(level, position)

This breaks level levels to the opcode at position

ECHO(string)

Outputs the string

Are They The Same

Well, looking at the opcodes, it's clear that they are not identical. They are ==, but not ===. The while(true) loop does a conditional jump followed by code followed by an unconditional jump. The for(;;) loop does a conditional jump, followed by code, followed by an unconditional jump, followed by another unconditional jump. So it does an extra jump.

Opcache

In 5.5, the Optimizer portion of opcache will optimize static conditional jumps.

So that means the while(true) code will optimize down to:

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

And for(;;) loop becomes:

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

This is because the optimizer will find and optimize out jump-chains. So if you're using 5.5's built-in opcache, they will be identical...

Caution

This is a complete and utter micro-optimization to base a decision on. Use the readable one. Don't use one based on performance. The difference is there, but it's trivial.

like image 86
ircmaxell Avatar answered Oct 12 '22 03:10

ircmaxell