Just another poke to surface it, in case this should be merged into the 7.0 branch as well :)
https://bugs.php.net/bug.php?id=74250 > On 19. Mar 2017, at 23:39, David Zuelke <d...@heroku.com> wrote: > > Thanks for the fixes, Nikita! > > Will they be merged to the PHP-7.0 branch as well? > > >> On 14 Mar 2017, at 16:39, Nikita Popov <nikita....@gmail.com> wrote: >> >> On Tue, Mar 14, 2017 at 11:29 AM, David Zuelke <d...@heroku.com> wrote: >> Hi all, >> >> There appears to be a performance regression in the CFG and DFA based >> optimization passes of OPcache in PHP 5.6+ when loading huge classes (such >> as those generated by Symfony's routing component) for the first time. >> >> The issue does not occur on PHP 5.5. Tests below are with 5.6.30, 7.0.16 and >> 7.1.2 and default INI settings; I replicated the issue on both macOS and >> Linux. >> >> Test file here (it's from an actual application, slightly anonymized, not a >> synthetic example): >> https://gist.github.com/dzuelke/fe867f55f09e0bf79ecefcc815b7fe92 >> >> Without OPcache, everything is fine in all versions: >> >> $ time -p php -dopcache.enable_cli=0 hugeclass.php >> real 0.10 >> user 0.09 >> sys 0.00 >> >> With OPcache on, things are suddenly much, much slower: >> >> 5.6: >> >> $ time -p php -dopcache.enable_cli=1 hugeclass.php >> real 3.23 >> user 3.21 >> sys 0.02 >> >> 7.0: >> >> $ time -p php -dopcache.enable_cli=1 hugeclass.php >> real 1.76 >> user 1.73 >> sys 0.02 >> >> 7.1: >> >> $ time -p php -dopcache.enable_cli=1 hugeclass.php >> real 4.01 >> user 3.98 >> sys 0.02 >> >> For comparison, 5.5 is as speedy as you'd expect it to be: >> >> $ time -p php -dopcache.enable_cli=1 hugeclass.php >> real 0.14 >> user 0.11 >> sys 0.02 >> >> If we switch off optimization passes 5 (CFG based) and 6 (DFA based, only in >> 7.1), everything is great again in all versions: >> >> $ time -p php -dopcache.enable_cli=1 -dopcache.optimization_level=0x7FFFFFCF >> hugeclass.php >> real 0.13 >> user 0.10 >> sys 0.02 >> >> For 5.6 and 7.0, pass 6 is not a thing, but in 7.1, we can inspect passes 5 >> and 6 separately. >> >> Pass 5 (CFG based) already makes for a drastic performance hit in 7.1: >> >> $ time -p php -dopcache.enable_cli=1 -dopcache.optimization_level=0x7FFFFFDF >> hugeclass.php >> real 0.88 >> user 0.86 >> sys 0.01 >> >> But pass 6 (DFA based) is the one that causes the biggest slowdown in 7.1: >> >> $ time -p php -dopcache.enable_cli=1 -dopcache.optimization_level=0x7FFFFFEF >> hugeclass.php >> real 3.29 >> user 3.24 >> sys 0.04 >> >> In all versions, subsequent loads from the cache (such as when running FPM >> or the built-in web server) are fast. >> >> Is this slowness with a cold cache expected/accepted, or does that qualify >> as a bug? >> >> Yes, this is a bug. Optimization should never be this slow. >> >> From a quick perf run, the problem in the DFA pass is that TI is quadratic >> in the number of calls (as call lookup is implemented as a linear scan). >> This can be fixed with a more efficient map lookup. >> The problem in the CFG pass is that a large buffer is zeroed repeatedly. >> >> Nikita > -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php