Code speed

Lars T. Kyllingstad public at kyllingen.NOSPAMnet
Wed Apr 14 04:03:14 PDT 2010


Lars T. Kyllingstad wrote:
> Don wrote:
>> Lars T. Kyllingstad wrote:
>>> Don wrote:
>>>> bearophile wrote:
>>>>> So far I've just given a light reading of the code. Notes:
>>>>
>>>>> - pow(x, 2) and sqrt(y) can be written as x ^^ 2 and y ^^ 0.5 (but 
>>>>> you have to import std.math anyway, because of a bug).
>>>>
>>>> That's not a bug. It's intentional. x ^^ y will probably always 
>>>> require import std.math, if y is a floating point number.
>>>
>>> Really?  Why is that?  I find that kind of disappointing, I always 
>>> believed it to be a temporary solution.
>>>
>>> I think the inconsistency with the other operators will make this a 
>>> major WTF for people new to the language.  Why should a^^b require an 
>>> explicit import while a*b doesn't?
>>
>> Because pow() for floating point, when implemented properly, is a HUGE 
>> function, that ends up dragging almost all of std.math into the 
>> executable. And I think it's deceptive to do that silently.
>> To make it completely built-in, basically all of std.math would need 
>> to be moved into druntime. Feel free to try to change my mind, of course.
> 
> Exponentiation is a built-in operation in FORTRAN, so I made this little 
> program to check:
> 
>       program test
> 
>       implicit none
>       real  :: base, expo, pow
> 
>       write (*,*) "Base:"
>       read  (*,*) base
>       write (*,*) "Exponent:"
>       read  (*,*) expo
> 
>       pow = base**expo
>       write (*,*) pow
> 
>       end program test
> 
> The produced executable is 11K.  If I replace exponentiation with 
> multiplication, it is still 11K.  Why wouldn't the same be possible in D?

Scratch that, I just remembered that libgfortran is dynamically linked 
in by default.  However, compiling with -static-libgfortran makes the 
executable 155K with both exponentiation and multiplication.

-Lars


More information about the Digitalmars-d-learn mailing list