speed of mpz_odd_p and lazy allocation
Marc Glisse
marc.glisse at inria.fr
Tue Aug 21 22:33:01 CEST 2012
On Tue, 21 Aug 2012, Marc Glisse wrote:
> I guess I should simulate the gains for std::vector, since those would
> also apply to gmpxx and not just external wrappers.
I made a very quick test. All I did was change the C++ wrapper so that
when I move-construct from a value, instead of calling mpz_init for the
moved-from object, I just set _mp_d to 0 (I should have used _mp_alloc
according to the conversation, but that's just a test). And in the
destructor, I call mpz_clear only if _mp_d!=0. Clearly this modification
is incomplete, it is just to get a feeling for potential gain.
I create a vector<mpz_class> and append a 0 (resize) to it a few million
times. With -std=c++11 and the current code, I get a time of 1. With
-std=c++03, I get 1.5. And with the small patch described above, I get
0.5.
I am a bit surprised that c++11 helps so much even with an old gmpxx.h
without move constructors/assignment. It seems to be because libstdc++
copies the 0s in c++03 and constructs them in place in C++11.
The factor 2 is probably never reached on realistic code, but the
difference should still be noticable in real code using small numbers.
Note that by default, C++11 assumes that destructors don't throw. If we
want to allow users to throw from their deallocation functions (why?), we
might want to specify it (which disables the optimization discussed here).
--
Marc Glisse
More information about the gmp-devel
mailing list