Recent CVS commit

Richard B. Kreckel kreckel at thep.physik.uni-mainz.de
Mon Oct 22 16:01:05 CEST 2001


Hi,

I just committed into CVS a major change how frequent numeric objects
(`flyweights') are set up.  Until now we had functions like `const ex
& _ex1(void)' that always returned the same ex representing numeric 1.
This speeds up the library considerably because ex::compare can be
restricted to pointer comparison.  However, the object inside that
function was constructed on first use of the function as a static
variable and thus came the two thorns in my side:

1) Ugly syntax: Several hundreds of occurrences of _ex0(), _ex1(),
   etc, resulting in fishbone Lisp-style.
2) The function call occuring there could not be avoided, resulting
   in degraded speed.

I have now figured a way how to avoid these problems.  Similarly to
section 27.4.2.1.6 in the C++ standard, where cout and friends are set
up, we now allocate a static initializer object in each object file
#include'ing <ginac/ex.h>.  The first of these constructors being
called takes care of setting up the flyweights `const numeric
*_num1_p' on the heap and marking them as `dynallocated' [*].  Then,
in file utils.cpp, we initialize both
    const numeric &_num1   = *_num1_p;
    const ex _ex1   = _num1;
Wherever we have been writing _ex1() we can thus simply write _ex1
internally.  Same applies to _num1() which is now called _num1.  As
advertised, the change makes parts of the library more readable and
the compiled library slightly smaller and about 5-15% faster.

I checked that it still works with Cint (5.15.14) and some other
unmodified apps.  Pearu, could you please check with PyGiNaC?  I
understand that Python sets up Flyweights from 0 to 100 as well but I
cannot see that the two are tied together in any way.  Therefore you
hopefully aren't affected at all.

Regards
     -richy.

[*] This assures ex' ctor from basic& does not copy it again.
-- 
Richard Kreckel
<Richard.Kreckel at Uni-Mainz.DE>
<http://wwwthep.physik.uni-mainz.de/~kreckel/>





More information about the GiNaC-devel mailing list