I'm really surprised by the results :) I'll try to find time for bigint on next week and play with it a bit.
Thanks. Dmitry. On Wed, Jan 7, 2015 at 2:54 AM, Andrea Faulds <a...@ajf.me> wrote: > Hey Dmitry, > > > On 23 Oct 2014, at 16:22, Dmitry Stogov <dmi...@zend.com> wrote: > > > >> I’ve so far been scared to touch the asm… but actually, I don’t think it > >> could be *that* hard. It’s not doing something especially complex. The > >> bigint API looks fairly stable now and I’m unlikely to change it much > >> further, so there’s little worry about having to change the asm a second > >> time. The main problem with asm, I suppose, is testing it. I do have a > >> 32-bit Ubuntu VM set up, but I’d also need to set up Windows VMs, and > >> possibly others (don’t we have PowerPC in the source just now?). > >> > > > > change asm for 32-bit Linux and add TODO marks for others. I don't test > PHP > > on PPC as well. > > After procrastinating about this for a long time, I finally went and > updated the overflow checks today and ran bench.php. > > I still haven’t touched the inline asm, I’ve just removed it, since clang > and GCC (only in GCC 5.0, sadly) have checked arithmetic intrinsics. If > someone wants to, they can rewrite the inline asm for compilers that have > no overflow-checking intrinsics, but this is good enough for now, at least > for the purposes of performance checking on my machine. I’m using clang, by > the way. If you want to replicate these results, you’ll probably also need > it, since GCC 5.0 isn’t out yet, unfortunately. > > I compiled the bigint-libtommath branch (theoretically this was just a > branch, but actually all the new changes have gone there, I’ll merge it > into the bigint branch once LibTomMath port is done), and the current > master branch. > > For bigint-libtommath, I used ./configure --enable-debug --enable-phpdbg > —-disable-all —-enable-bigint-gmp > > Because of the —-enable-bigint-gmp flag, it’s using the GMP backend, not > the LibTomMath one. I’m doing this since there’s still one or two small > things I haven’t finished implementing for LibTomMath, e.g. the binary > bitwise ops have the wrong behaviour just now. > > For master, I used ./configure --enable-debug --enable-phpdbg —-disable-all > > Then, I ran bench.php four times, and each time I ran it first on > ./php-bigint-gmp, then on ./php-bigint-master. > > On each run, the bigint branch turned out faster, as well as overall: > > bigint master > 6.593 6.659 > 6.424 6.661 > 6.414 6.588 > 6.381 6.673 > AVERAGE > 6.453 6.64525 > DIFFERENCE > -0.19225 0.19225 > RATIO > 0.971069561 1.0297923446 > > So master is 2.9% slower! Full output here: > https://gist.github.com/TazeTSchnitzel/759c1513b442571f5e26 > > I can’t actually explain why bigints would be faster. It might just be > because I got rid of fast_increment_function in favour of just checking of > op1 == ZEND_LONG_MAX in zend_vm_execute.h, ditto for > fast_decrement_function. Maybe using overflow intrinsics is faster than > inline asm. Maybe it’s something completely different. I honestly don’t > know. > > The result surprised me as I expect bigints would be slower, so I redid > it. Again, bigints came out on top: > > bigint master > 6.55 6.779 > 6.353 6.738 > 6.326 6.674 > 6.144 6.177 > AVERAGE > 6.34325 6.592 > DIFFERENCE > -0.24875 0.24875 > RATIO > 0.9622648665 1.0392149135 > > This time master was around 3.9% slower. Full log here: > https://gist.github.com/TazeTSchnitzel/59c190b86c9dd5b20570 > > If we combine the two runs: > > bigint master > 6.593 6.659 > 6.424 6.661 > 6.414 6.588 > 6.381 6.673 > 6.55 6.779 > 6.353 6.738 > 6.326 6.674 > 6.144 6.177 > AVERAGE > 6.398125 6.618625 > DIFFERENCE > -0.2205 0.2205 > RATIO > 0.9666849232 1.0344632216 > > master’s 3.4% slower. > > Just to check I named the files correctly: > > oa-res-26-240:php-src ajf$ ./php-master -r 'var_dump(PHP_INT_MAX * 2);' > float(1.844674407371E+19) > oa-res-26-240:php-src ajf$ ./php-bigint-gmp -r 'var_dump(PHP_INT_MAX * 2);' > int(18446744073709551614) > > Yes, it’s definitely the bigint branch. > > So, at least by these preliminary results, the bigint branch would appear > to be faster than master. This is merely bench.php, but it’s still a good > sign. :) > > Thanks! > -- > Andrea Faulds > http://ajf.me/ > > > > >