Bug #73265 [Opn]: Loading browscap.ini at startup causes high memory usage

From: Date: Fri, 16 Dec 2016 19:01:59 +0000
Subject: Bug #73265 [Opn]: Loading browscap.ini at startup causes high memory usage
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-206079@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=73265&edit=1 ID: 73265 Updated by: nikic@php.net Reported by: spam2 at rhsoft dot net Summary: Loading browscap.ini at startup causes high memory usage Status: Open Type: Bug Package: Performance problem Operating System: Linux PHP Version: 7.0.14 Block user comment: N Private report: N New Comment: PR up at https://github.com/php/php-src/pull/2242. Quoting the performance numbers: > * According to massif, the peak memory usage of PHP drops from 85MB to 23MB. > * The startup time of PHP drops from 0.19s to 0.10s. > * The time of running the get_browser_basic.phpt test with this ini drops from 19s to 0.23s. > (!!!) Previous Comments: ------------------------------------------------------------------------ [2016-12-16 18:31:33] nikic@php.net It is a runtime option, see pcre.jit. The PCRE JIT optimizes the case where a pattern is compiled once and used multiple times. Browscap instead uses a huge amount of patterns only once. In this case the overhead of JIT compilation is larger than the benefit during the matching of the pattern. ------------------------------------------------------------------------ [2016-12-16 17:29:31] spam2 at rhsoft dot net indeed PHP 7.1 build with "--without-pcre-jit" is faster, while fast is relative given that the test did only 10 calls - what is the purpose of the JIT then and can this not be a runtime option for the cases where it brings a benefit? <?php $loops = 10; for($count=1; $count<=$loops; $count++) { $x = get_browser('Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:50.0) Gecko/20100101 Firefox/50.0'); } ?> [harry@srv-rhsoft:/scripts/php5-versus-7]$ ./test.sh PHP 5.6 real 0m5.922s user 0m5.861s sys 0m0.027s PHP 7.0 real 0m14.894s user 0m14.716s sys 0m0.079s PHP 7.1 real 0m3.335s user 0m3.285s sys 0m0.031s ------------------------------------------------------------------------ [2016-12-16 16:57:15] spam2 at rhsoft dot net wait - the JIT makes things slower? i had assumed the opposite so you tell me the change below should be the exactly opposite and with 7.1 configure can disable it while --without-pcre-jit don't exist for 7.0 and it's always enabled there? * Thu Dec 8 2016 Reindl Harald <h.reindl@thelounge.net> - update to PHP 7.0.14 - add 'with-pcre-jit' for upcoming 7.1 to configure ------------------------------------------------------------------------ [2016-12-16 16:45:39] nikic@php.net get_browser() is probably slower in PHP 7 because of the PCRE JIT. Most of the time in get_browser() is spent is compiling regular expressions, and the JIT requires more complication time. I have spent some time yesterday implementing many memory usage and performance optimizations for browscap, I'll probably put up a PR today. However, the changes are very extensive, so not sure if we target PHP 7.0 for that. ------------------------------------------------------------------------ [2016-12-16 16:38:58] spam2 at rhsoft dot net so - now it is proven that get_browser() with PHP7 is magnitudes slower than with PHP5, i have stored the binaries and extensions of the two versions running before and after the upgrade and gave them identical configurations PHP 5.6.26 (cli) (built: Oct 3 2016 12:45:59) PHP 7.0.11 (cli) (built: Oct 5 2016 22:28:49) ______________________________ 10 x get_browser('Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:50.0) Gecko/20100101 Firefox/50.0'); [harry@srv-rhsoft:/data/scripts/php5-versus-7]$ ./test.sh PHP5 real 0m5.876s user 0m5.799s sys 0m0.034s PHP7 real 0m14.396s user 0m14.216s sys 0m0.085s ______________________________ 100 x get_browser('Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:50.0) Gecko/20100101 Firefox/50.0'); [harry@srv-rhsoft:/data/scripts/php5-versus-7]$ ./test.sh PHP5 real 0m57.583s user 0m57.180s sys 0m0.052s PHP7 real 2m23.615s user 2m22.030s sys 0m0.691s ______________________________ that's factor 2.4 and so in fact the asnwer to my initial question below is "get_browser()" which was used until yesterday on every inital request with no active session which is always true for "ab"-benchmarks so one thing is the dramatical memory usage with 7.0.14 but in general the function got extremely slow with the same "browscap.ini" _________________________ we have two different inhouse cms-systems, while one is 46% faster with PHP7 the other one sucks terrible - are there things known by developers which are internally slower now while most other become faster and should be avoided? ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at https://bugs.php.net/bug.php?id=73265 -- Edit this bug report at https://bugs.php.net/bug.php?id=73265&edit=1

« previous php.bugs (#206079) next »