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.
Shortlink
This article has a short URL available: https://drck.me/jit1-fmy
Comments
Curious if providing argument and return types and specifying strict_types would increase performance? Doing so would allow PHP to bypass a lot of the dynamic type magic, no? Likely not a huge increase but maybe enough to put it over the 50% mark?
Add Comment
My Amazon wishlist can be found here.
Life Line
Created 6 benches, a main entrance, and a bicycle_parking; Updated 2 main entrances
Created 4 trees, a balancebeam, and 3 other objects; Updated 5 benches and 2 waste_baskets
I walked 7.1km in 1h21m33s
Merge branch 'xdebug_3_5'
Merged pull request #1092
Use actual PID here, as we use that to be able to connect
Created 2 main entrances; Updated a vacant shop, a furniture shop, and a cafe; Confirmed an estate_agent office, a laundry shop, and 4 other objects
I walked 8.6km in 1h30m43s
Merged pull request #1091
PHP 8.6: Fixed test expectation for 'debugInfo' name in error
Add 'strace' to run-xdebug-tests.php command
Oystercatcher Parent and Chick
Standing on the edge of a lake in the Arundel Wetlands.
#birds #birdPhotography #Birdsoffediverse #Photography #Nature #Wildlife
Updated 2 main entrances
I walked 14.4km in 2h39m37s
Fixed tagging and bollard location
I hiked 8.7km in 4h4m28s
Updated a restaurant
Updated a restaurant
Updated a restaurant
I walked 5.5km in 56m26s
Created an entrance
I walked 5.7km in 1h20m50s
Updated a fitness_centre; Confirmed a charging_station
I walked 4.0km in 47m13s
I walked 1.1km in 9m32s
