RE: 2.5 feature for speed?

new topic     » topic index » view thread      » older message » newer message

> From: Euman
> 
> 
> Im sorry, I get 4.12 seconds for euphoria for win
> and 15.2 on euphoria for dos
>
> > 
> > Rob see if you can optimize this in the next version PowerBasic 
> > Elapsed time: 0.84 seconds on a 600 Mhz Pentium, this takes 15.2 
> > seconds on my 2.53ghz using Euphoria
> > 
> > simple floating point operation
> > 
> > without type_check
> > 
> > atom t, x, y 
> >     x = 1
> >     y = 1.000001
> >     t = time()
> >     for i = 1 to 100000000 do
> >         x *= y
> >     end for

What exactly are you interested in optimizing?  I suspect that it's not 
this *exact* case, since you could be a lot faster with power().  You're 
probably more interested in floating point arithmetic in general.  
Perhaps it would be beneficial to have a float sub-datatype of atom like 
we have integers (although I think this might break a lot of stuff 
inside the interpreter).  You could get rid of some of the overhead of 
checking for floating points the same way you do with using pure 
integers.

Here's a function that can calculate large powers pretty quickly:

function power_big( atom num, atom pow )
	sequence bits, p2
	integer bit, last, ix
	atom t, result, powers
	
	bit = 1
	p2 = {}
	bits = int_to_bits( pow, 32 )

	for j = 1 to 32 do
		if bits[j] then
			p2 &= bit
		end if
		bit += 1
	end for
	
	last = length(p2)
	powers = num

	if find(1,p2) then
		result = num
		ix = 2
	else 
		result = 1.0
		ix = 1
	end if
	bit = 1

	while ix <= last do
		powers *= powers 
		bit += 1
		if p2[ix] = bit then
			result *= powers
			ix += 1
		end if
	end while
	return result
end function

Here are some benchmarks from a 2.4GHz P4.
power():  26879827172956060000000000000000000000000000 (0.0000003137s)
power_big:26879827232954420000000000000000000000000000 (0.0000056s)
bigbase:  26879827394087344246158930004723131138766976 (0.0115s)
euman:    26879827172977660000000000000000000000000000 (3.610000s)

bigbase is a bigmath library that I've worked on now and then, and I've 
only given the integer part (power_big was based on bigbase.e code).  
The calculation was done using 3000 bits of accuracy (there are 148 
digits beyond the decimal point).  The integer part is stable even if I 
increase to 30,000 bits, so you can see that we're only getting about 8 
of 16 digits accurately.

I translated your code and compiled with OpenWatcom 1.0 (euman1).  Then 
I optimized the loop a bit for euman2 by avoiding creating a new double 
each time, and it ran a lot faster:


euman1:    26879827172977660000000000000000000000000000 (3.966000s)
euman2:    26879827172977660000000000000000000000000000 (1.191000s)

The new loop:
	if (_0i > 100000000)
		goto L3;
	//_0 = _0x;
	//_0x = NewDouble(DBL_PTR(_0x)->dbl * DBL_PTR(_0y)->dbl);
	//DeRef(_0);
	DBL_PTR(_0x)->dbl = DBL_PTR(_0x)->dbl * DBL_PTR(_0y)->dbl;
	_0i = _0i + 1;
	goto L2;

I suspect that this is the sort of optimization that we can expect for 
Rob to start making in the new Euphoria-coded translator.

Matt Lewis

new topic     » topic index » view thread      » older message » newer message

Search



Quick Links

User menu

Not signed in.

Misc Menu