On Tue, Mar 3, 2015 at 6:57 PM, Zeev Suraski <z...@zend.com> wrote: > > -----Original Message----- > > From: Anthony Ferrara [mailto:ircmax...@gmail.com] > > Sent: Tuesday, March 03, 2015 5:44 PM > > To: Zeev Suraski > > Cc: PHP Internals > > Subject: Re: [PHP-DEV] Re: Zend JIT Open Sourced > > > > Zeev, > > > > On Tue, Mar 3, 2015 at 8:05 AM, Zeev Suraski <z...@zend.com> wrote: > > >> So I do apologize to the person. I don't to the code. > > > > > > I wanted to verify whether my gut was correct (minimal amount of > > > output, and stdout is in fact buffered - output shouldn't move the > > > needle) and asked Dmitry to rerun the C test on the same system, but > > > this time with the output code completely commented out: > > > real 0m0.011s (+- 0.01) > > > user 0m0.011s (+- 0.01) > > > sys 0m0.001s > > > > > > Apologies to the code might be in order :) > > > > > > The source of the JIT engine's edge is, as Dmitry and Andi said, the > > > CPU-specific optimizations that gcc -O2 doesn't generate, and > > > therefore it can actually be faster than a generic native executable > > > in some (I would guess not all that common) cases. > > > > So, let's put that to the test, shall we. I compiled and ran the "JIT" > > compiler (can we please stop calling it that, it's not). along side PHP > > 5.5, PHP > > 7 and GCC -O0 through -O3. > > > > I also turned on the ob_start and off (commenting out the ob_start and > > ob_end_flush lines): > > > > https://docs.google.com/spreadsheets/d/1b4yFh0i62haDoQBRf8pOoi63OLr > > xRbecHSj9sQpD5Nk/edit?usp=sharing > > > > With ob_start, the "JIT" was fastest. Without it, it was more than 2x > > slower > > (slightly faster than -O0). > > > > Raw results (average): > > > > GCC -O0: 0.0258 > > GCC -O1: 0.0160 > > GCC -O2: 0.0144 > > GCC -O3: 0.0140 > > "JIT" /w ob_start: 0.011 > > "JIT" /wo ob_start: 0.0238 > > 5.5 /w: 1.273 > > 5.5 /wo: 1.301 > > 7 /w: 1.492 > > 7 /wo: 1.545 > > > > I used identical code to what Dmitry posted earlier, with the one > > exception > > that ob_start was commented out for the "/wo" runs. > > > Anthony, > > What you demonstrate here is that direct output slows PHP down (at least > php-cli), but not that it's the reason that PHP runs faster. > As we don't really care about the output layers when benchmarking > Mandelbrot - but rather at how fast the algorithm is executed, eliminating > output in both tests is the simplest and most accurate to benchmark the raw > performance of the execution engine. And the (very experimental) JIT > engine > wins here. > > > Now, there's something really interesting in those results. The numbers > > given > > back from the "JIT" are far more stable than anything else (more than an > > order of magnitude more stable /wo, and several orders /w ob_start). > > Something smells off about it. I'm not so sure what off hand, but I'm > > going to > > dig further. > > > > Now, to the point that "gcc uses output buffering". > > Not gcc, glibc's stdout. >
CLI uses unbuffered write() syscall. Thanks. Dmitry. > > > Yes, it does. > > However, PHP (including the "JIT") is compiled with GCC. So it will use a > > similar output buffer unless you disable the buffer. The only place in 7 > > that > > we do that is sapi/phpdbg/phpdbg.c:881. So either way, you're going to be > > using the same output buffer on the STDOUT stream. > > Actually no, it doesn't, not if you use CLI. The CLI SAPI uses the > write(1, > ...) syscall, which is unbuffered. You would have been correct if it was > using fwrite(..., stdout) - but it doesn't. See > > stackoverflow.com/questions/1360021/why-fwrite-libc-function-is-faster-than-write-syscall > > So in reality, what Dmitry did by adding the ob_start() call is actually > make the PHP version (more or less) equivalent to the C version, as opposed > to giving it an unfair advantage. > > If you *really* want to test the raw performance difference, get rid of the > output code altogether in both the PHP and C versions. I haven't tried > that, but as I do believe our output buffering code is a lot more > complicated than that of glibc's streams - my guess is that the gap between > the two implementations would actually grow bigger, and in PHP's favor. We > already know that the PHP version with the output (using the output > buffering layer) runs as fast as the C version with no output at all. > > Zeev > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: http://www.php.net/unsub.php > >