Is D slow?

Steven Schveighoffer via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sat Jun 10 03:59:24 PDT 2017


On 6/10/17 5:00 AM, Honey wrote:
> On Friday, 9 June 2017 at 23:10:28 UTC, Ali Çehreli wrote:
>> You would get the exact performance if you implemented e.g. with
>> pointers. Your test has been very valuable for exposing an
>> embarrassing performance issue. :)
>
> I can confirm that, after changing implementation to the following,
> performance is on par. It is not immediatetly clear to me how
>
>  r[r[0 .. i].getTransitionIndex!Less(r[i]) .. i + 1]
>
> would look like if written idiomatically.

I wrote it like this, which confirms that it's indeed bringToFront (I 
tried your getTransitionIndex function, but that didn't change timings 
at all):

void insertionSort(alias Less, Range)(Range r)
if (hasLength!Range && isRandomAccessRange!Range && hasSlicing!Range)
{
     foreach (immutable i; 1 .. r.length)
     {
         auto ubElem = i - r[0 .. 
i].assumeSorted!Less.upperBound(r[i]).length;
         r[ubElem .. i+1].rotateRight;
     }
}

On my mac, it's completing in about 4.4 seconds, whereas the C++ version 
completes in around 3.

Optimized your rotateRight a bit to get better performance when we can 
use memmove:

void rotateRight(Range)(Range r)
     if (hasLength!Range && isRandomAccessRange!Range && hasSlicing!Range)
{
     auto t = r[$ - 1];
     static if(isDynamicArray!Range)
     {
         import core.stdc.string;
         memmove(r.ptr + 1, r.ptr, (r.length - 1) * r[0].sizeof);
     }
     else
     {
         foreach_reverse (i; 0 .. r.length - 1)
         {
             r[i + 1] = r[i];
         }
     }
     r[0] = t;
}


Brings it to exactly c++ performance :)

I'll update the bug report.

-Steve


More information about the Digitalmars-d-learn mailing list