PHP bytecode (un-)optimizations

Have you ever looked into PHP compiled byte code ? If not - I suggest you doing so, because :

  1. When analyzing bytecode - you will become a better developer, knowing how to write more efficient PHP code and it will increase your code reading skills too.

  2. You will understand the need of the JIT compiler for a PHP (it's currently in a road-map)

I will skip tutorial part about How to see PHP script's compiled bytecode - there are a lot of such tutorials in internet, for example this one is good . Instead, let's jump to the rant about How PHP generates un-optimized bytecode.

Here is a test snippet of which bytecode we will check :

$a = 10;
$b = 5;
if ($b > $a) echo $a;

And PHP generates such bytecode for snippet above :

0 ASSIGN_____________!0, 10
1 ASSIGN_____________!1, 5
2 IS_SMALLER____~4__!0, !1
3 JMPZ_______________~4,->5
4 ECHO______________!0
5 RETURN____________1

What a mess !! Needless to say that PHP - at least in this case - doesn't perform bytecode optimizations. IF it would - it would see that this bytecode semantically is equivalent to :

0 JMP________________->5
1 ASSIGN_____________!1, 5
2 IS_SMALLER____~4__!0, !1
3 JMPZ_______________~4,->5
4 ECHO______________!0
5 RETURN____________1

Or even to :

0 NOP_______________
1 NOP_______________
2 NOP_______________
3 NOP_______________
4 NOP_______________
5 RETURN____________1

Which is same as simply :

0 RETURN____________1

(An empty PHP script)

We have saved 5 bytecode instructions ! Why to generate redundant code ?

EDIT:

I've missed one side effect - IF globals $a,$b are used in other scripts then including this exact script somewhere else - will change program behavior, so in that case script bytecode is equivalent to :

0 ASSIGN_____________!0, 10
1 ASSIGN_____________!1, 5
2 RETURN_____________1

Still we saved 3 bytecode instructions ! So JIT'er should evaluate globals usage and according to that - generate most optimal bytecode possible.

No Comments Yet