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/
>>
>>
>>
>>
>>
>

Reply via email to