performance question

DTAshley at aol.com DTAshley at aol.com
Fri Apr 30 06:29:58 CEST 2004


Hi Nathan,

In short, I would just move all the variables involved to be external to the 
functions (i.e. global), then initialize them once, do all the stuff you have 
to do, then clear them once (optional).  That way you can still have a 
function call, but without all the new and destroy-type overhead.

In effect, change the variables from storage class automatic to another 
storage class so they have permanent lifetime.

BTW, welcome to the real world.  There is often a tradeoff between 
performance and the management of complexity.  Better performance comes at the cost of 
increased complexity.  Tools can help you out a bit (inline functions, etc.), 
but in the end you still can encounter scenarios that no compiler is smart 
enough to handle.

BTW, I don't think inline functions will help you out much.  The real 
performance hit will be malloc() and free(), which doesn't go away by inlining.  The 
function call is probably not a tangible factor.  You've gotta change the 
lifetime of those variables to avoid repeated deallocation and allocation.

To answer this question:

<BEGIN>
To reiterate, will a compiler figure out that mpq_init and mpq_clear 
iterated each time the compute_value() function is called is stupid and 
inline the function for me, or should I inline the functions myself for 
a noticeable performance benefit?
<END>

a)The compiler won't figure it out, and

b)Inlining won't help you unless you remove the repeated allocation and 
deallocation.

Dave.

In a message dated 4/29/2004 11:06:24 PM Eastern Daylight Time, 
nmoore at physics.umn.edu writes:
Hello,

I'm currently using gmp to compute the value of a rather delicate 
polynomial many times.  To stay sane I wrote the c program in a modular 
fashion so that the delicate gmp stuff is in a function called from 
main.  What I'm wondering is if calling the function many many times 
(the function creating, initializing, and at the end, clearing the 
mpq_t variables over and over) is stupid in terms of performance costs. 
  I've thought about re-writing the program to just have one function 
and avoid this initialization cost, but that seems really hard to read 
(about 1000 lines).

The code is roughly as follows,

main() {

    //do some initialization stuff, including
    mpq_t b[100];
    for(i=0;i<100;i++) { mpq_init(b[i]); }

    // main iteration, called function includes many mpq functions
    term[0]=1.0;
    for(i=0;i<10000;i++) {
        for(j=1;j<100;j++) {
            term[j] = compute_value(b, j);
        }
    }

    // do some clean up stuff
    for(i=0;i
-------------- next part --------------
An HTML attachment was scrubbed...
URL: /list-archives/gmp-discuss/attachments/20040430/8085f5b2/attachment.htm


More information about the gmp-discuss mailing list