Faster sort?

Andrea Fontana via Digitalmars-d digitalmars-d at puremagic.com
Thu Apr 7 00:57:11 PDT 2016


On Wednesday, 6 April 2016 at 18:54:08 UTC, tsbockman wrote:
> On Wednesday, 6 April 2016 at 08:15:39 UTC, Andrea Fontana 
> wrote:
>> Using ldmd2 -O -release -noboundscheck -inline sort.d && ./sort
>>  instead:
>>
>> 2 inputs:
>> Faster: 0 hnsecs
>> Phobos: 33 μs and 5 hnsecs
>>
>> ...
>>
>> 65536 inputs:
>> Faster: 0 hnsecs (???)
>> Phobos: 7 secs, 865 ms, 450 μs, and 6 hnsecs
>
> Can you share the benchmark code?
>
> "0 hnsecs" results generally mean that your test was too simple 
> and/or didn't have any obvious side effects, and so the 
> optimizer just removed it completely.

A simple test just written:

    Duration total;

    foreach(_; 0..10000)
    {
       auto arr = generate!( () => uniform(0,2)).map!(x => 
cast(bool)x).take(65536).array;
       StopWatch sw;
       sw.start;
       boolSort(arr);
       total += sw.peek.to!Duration;
       sw.stop;

    }


andrea at ububocs:/tmp$ ./sort
0 hnsecs

I don't think compiler can remove a random generated array...
I think times are too small to be measured with a good accuracy, 
using start() stop() to resume stopwatch seems to add a (fixed) 
overhead (some microsecs over the 10000 cycles) that doesn't 
depend on size of array tested.
Anyway, it doesn't matter if it is 0 hnsec or some microsecs, in 
my opinion. It's still faster and faster than original sort (of 
course it's n vs n*log(n)). Here the same code with "sort(arr)" 
instead of "boolSort(arr)":

andrea at ububocs:/tmp$ ./sort
10 secs, 620 ms, 414 μs, and 2 hnsecs

Andrea




More information about the Digitalmars-d mailing list