Speeding up floating point number reading

Daniel Kraft d@domob.eu
Mon Dec 29 16:31:00 GMT 2008


Sorry guys,

but with the obvious fix for the return value, the program really works 
(even with the checks enabled)...

Daniel

> as promised on PR 38654, I gave floating point reading a look.  I used 
> the attached program for testing with -O3 -static.  It takes around 31s 
> on my system with an unpatched gfortran 4.4.
> 
> First, I tried to replace the strtod call in 
> libgfortran/io/read.c:convert_real with a custom made parser according 
> to the one I implemented for FreeWRL, and even got execution time to 
> around 29s (a bit surprising, I though strtod must be well optimized).
> 
> However, I then looked further, and discovered that read_f, the caller 
> of convert_real, is already doing most of the work!  And then, it prints 
> the number back to a string just to parse it again using convert_real... 
> With the simple (experimental and rough) patch attached, the final 
> floating point value can be calculated with little additional effort in 
> read_f, without ever calling convert_real.  This cuts the execution time 
> in half to 15.5s!
> 
> The only weak point is that I'm not sure if we may experience rounding 
> errors in parsing the float due to all the *10 and + operations, and 
> that could be something strtod takes care of.  On the other hand, I 
> think this is rather unlikely.  What do you think about this one?
> 
> I'm going to work out a real patch, that handles all kinds, not just 
> double, and in addition cleans up all now-useless stuff.  Comments welcome!
> 
> Yours,
> Daniel
> 


-- 
Done:  Arc-Bar-Cav-Rog-Sam-Tou-Val-Wiz
To go: Hea-Kni-Mon-Pri-Ran



More information about the Fortran mailing list