PHP 8: A Quick Look at JIT
Following on from a PHP 8/JIT benchmark on twitter, I decided to have a look myself.
I've picked an example that I know speeds up really well when reimplementing it in C. I wrote about this RDP algorithm some time ago.
What it does is to take a line of geospatial points (lon/lat coordinates), and simplifies it. It's my go-to example to show raw algorithmic performance, which is probably the best place to use a JIT for non-trivial code. I actually use this in production.
With PHP 7.4:
$ pe 7.4dev; time php -n \
-dzend_extension=opcache -dopcache.enable=1 -dopcache.enable_cli=1 \
-dopcache.jit=1235 -dopcache.jit_buffer_size=64M \
bench-rdp.php 1000
Using array (
0 => 'RDP',
1 => 'simplify',
)
real 0m8.778s
user 0m8.630s
sys 0m0.117s
(I realise that the opcache arguments do nothing on the command line here). This runs RDP::simplify (my PHP implementation) 1000 times in about 8 seconds.
With PHP 8.0 and JIT:
$ pe trunk; time php -n \
-dzend_extension=opcache -dopcache.enable=1 -dopcache.enable_cli=1 \
-dopcache.jit=1235 -dopcache.jit_buffer_size=64M \
bench-rdp.php 1000
Using array (
0 => 'RDP',
1 => 'simplify',
)
real 0m4.640s
user 0m4.627s
sys 0m0.008s
It jumps from ~8.8s to ~4.6s, a reduction in time of ~4.2s (or 48%), which is pretty good.
Now if I run the same with the geospatial extension which has a C implementation.
With PHP 7.4 and the extension:
$ pe 7.4dev; time php -n -dextension=geospatial \
-dzend_extension=opcache -dopcache.enable=1 -dopcache.enable_cli=1 \
-dopcache.jit=1235 -dopcache.jit_buffer_size=64M bench-rdp.php 1000
Using 'rdp_simplify'
real 0m0.695s
user 0m0.675s
sys 0m0.021s
Which gives a reduction in speed compared to PHP 7.4 of ~8.1s (or 92%).
So it looks like the JIT does do some good work for something that's highly optimisable, but still nowhere near what an implementation in C could do.
The code that I used is in this Gist.
This ran on a 4th gen ThinkPad X1 Carbon, making sure my CPU was pinned at its maximum speed of 3.3Ghz. Although I've pasted only one result for each, I did run them several times with very close outcomes.
Life Line
I walked 9.1km in 1h35m19s
What new fresh hell is this?
"Please click here and tick the box if you DO NOT want to be opted in."
And when you click on the non-visible link:
"[ ] I DO NOT want to be opted in."
@jamesholden Have you ever seen the Expanse? One of the main characters shares your name!
I walked 2.1km in 21m40s
I walked 6.7km in 1h15m34s
I walked 10.6km in 1h44m34s
I walked 4.4km in 51m58s
I walked 8.2km in 1h40m07s
I walked 2.4km in 38m25s
@Edent With your ActivityPub implementation, have you figured out how to allow quote posts for your bot posts yet?
📷 Brown Cap in the Grass
🚩 Herikhuizerweg, Rheden, Nederland
I walked 0.9km in 11m17s
I walked 2.8km in 25m32s
I walked 4.6km in 1h8m02s
📷 Stalkers Lane
🚩 Graywood Lane, Wealden, United Kingdom
I hiked 23.0km in 4h10m15s
I walked 3.9km in 39m07s
After my PHP 8.5 in Leeds last night, it's now time to head to Rotterdam to give the same talk there tonight!
It's cold out here, but atleast the snow is now gone.
I walked 1.7km in 13m18s




Shortlink
This article has a short URL available: https://drck.me/jit1-fmy