[squeak-dev] Speeding up Float Numbers reading

nicolas cellier ncellier at ifrance.com
Tue Mar 11 01:05:32 UTC 2008


Following Andreas ReadStream>>nextFloat track, I did improve 
SqNumberParser speed too, just for fun.

With minor changes, a speed factor > 2 in Float crunching has been achieved.
I could not reach Andreas efficiency, though.
SqNumberParser is still 2 to 4 times behind.

A difference is that SqNumberParser does return the nearest floating 
point value, while ReadStream>>nextFloat does return an approximate. 
This explains some of the bad scores of the former which cannot avoid 
LargeInteger arithmetic when the latter does (cases of exponent with 
high values).

This can be marginally improved with timesTwoPower: trick in the 
Fraction case, which would sometimes avoid LargeInteger arithmetic.
But the implications with Float overflow and underflow must be handled, 
and it's not really worth...

Remaining performance is mostly explained by method inlining, which is 
not desirable in SqNumberParser. It could however be subclassed with an 
OptimizedSqueakFloatParser (I did not...).

Experiments are at http://bugs.squeak.org/view.php?id=6976 if anyone 
interested.

I remind there are also tricks that SqNumberParser uselessly deals with 
like:
| s |
s := '1' , (String new: 400 withAll: $0) , '.1e-400'.
{s readStream nextFloat. SqNumberParser parse: s readStream. Number 
readFrom: s readStream}.

Last thing, speeding up Float reading is not premature optimization, 
large files made of formatted Float are widely used in some areas.
Sure an atof() primitive would probably outperform if that really matters...

Nicolas




More information about the Squeak-dev mailing list