D 50% slower than C++. What I'm doing wrong?

Joseph Rushton Wakeling joseph.wakeling at webdrake.net
Sun Apr 15 01:29:39 PDT 2012


On 15/04/12 09:23, ReneSac wrote:
>> What really amazes me is the difference between g++, DMD and GDC in size of
>> the executable binary. 100 orders of magnitude!
> I have remarked it in another topic before, with a simple "hello world". I need
> to update there, now that I got DMD working. BTW, it is 2 orders of magnitude.

Ack.  Yes, 2 orders of magnitude, 100 _times_ larger.  That'll teach me to send 
comments to a mailing list at an hour of the morning so late that it can be 
called early. ;-)

>> Sounds stupid as the C stuff should be fastest, but I've been surprised
>> sometimes at how using idiomatic D formulations can improve things.
>
> Well, it may indeed be faster, especially the IO that is dependent on things
> like buffering and so on. But for this I just wanted something as close as the
> C++ code as possible.

Fair dos.  Seems worth trying the idiomatic alternatives before assuming the 
speed difference is always going to be so great, though.

> Yeah, I don't know. I just did just throw those qualifiers against the compiler,
> and saw what sticks. And I was testing the decode speed specially to see easily
> if the output was corrupted. But maybe it haven't corrupted because the compiler
> don't optimize based on "pure" yet... there was no speed difference too.. so...

I think it's because although there's mutability outside the function, those 
variables are still internal to the struct.  e.g. if you try and compile this code:

       int k = 23;

       pure int twotimes(int a)
       {
             auto b = 2*a;
             auto c = 2*k;
             return b+c;
       }

... it'll fail, but if you try and compile,

       struct TwoTimes
       {
             int k = 23;

             pure int twotimes(int a)
             {
                   auto b = 2*a;
                   auto c = 2*k;
                   return b+c;
             }
       }

... the compiler accepts it.  Whether that's because it's acceptably pure, or 
because the compiler just doesn't detect this case of impurity, is another 
matter.  The int k is certainly mutable from outside the scope of the function, 
so AFAICS it _should_ be disallowed.


More information about the Digitalmars-d-learn mailing list