Hi Andrea, Where can I get the code?
Thanks. Dmitry. On Thu, Jan 8, 2015 at 7:02 PM, Dmitry Stogov <dmi...@zend.com> wrote: > 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/ >> >> >> >> >> >