
[Pari/GP] Extreme runtime effect when expression was unoptimized
Posted:
Nov 5, 2011 12:30 PM


Hi  I've got an extreme effect of the rewriting of a relatively simple formula. I've done three versions of the same formula; it is the iteration of
g(x) = (sqrt(1+x)x)^2  1
in principle by a call like this:
f(x,h) = for(k=1,h, x = g(x)); return (x )
I worked with float precison of 200 digits.  That was the initial idea.
Somehow innocently I tried to do a small optimization . First I made the functionexpression explicite in f(x,h) to avoid overhead of function calls:
f (x,h) = for(k=1,h,x = (sqrt(1+x) x)^21 );x
Then I thought, possibly it would be better to expand the squaring:
f2(x,h) = for(k=1,h,x = x  2*x*sqrt(1+x) + x^2 );x
and finally to take benefit from the more concise notation for the process of updating of a variable's value in the memory:
f3(x,h)=for(k=1,h,x *= ((1+x)2*sqrt(1+x)) );x
Then I let the three versions repeat 1200 times h = 1200 \\ call of function \\ iter result time [h,f (1.0,h),gettime] [1200, 0.0406225463413, 4078] [h,f2 (1.0,h),gettime] [1200, 0.0406225463413, 47] [h,f3 (1.0,h),gettime] [1200, 0.0406225463413, 46]
Well, I would already like to know how that nearly 100fold time consumtion can be explained.
But more: if I simply double the iteration height, then in the original f (x,h) version there occurs timeconsumtion which I cannot understand at all:
h=2400 \\ call of function \\ iter result time [h,f (1.0,h),gettime] [2400, 0.0287900934710, 42235] [h,f2 (1.0,h),gettime] [2400, 0.0287900934710, 93] [h,f3 (1.0,h),gettime] [2400, 0.0287900934710, 79]
The f(x,h)version does not only double its timeconsumtion but needs nearly the 10fold time now. How can this happen?
Gottfried Helms

