On Tuesday, 5 January 2016 at 19:42:42 UTC, Ali Çehreli wrote:
You are traversing the array per index value (1000 times), which can be done once up front:

Good point. I guess I assumed `map!` was magic.



    // Now they get their own arrays:
    auto benchmarks = benchmark!(() => algorithmSort(arr.dup),
() => countingSort(arr.dup))(1);


I'm not sure what this explicitly is doing... Are you defining an anonymous function? If so, that seems really useful.


    uint[valueCount] hist;
    arr.each!(a => ++hist[a]);

auto result = hist[].enumerate.map!(t => t[0].repeat(t[1])).joiner;
    // To make sure that we consume the lazy range:
    return result.sum;
}
I think .joiner is what you're looking for.


Thanks a lot for this. Coming from a webdev background I'm ashamed I didn't guess `join`. That said, I don't think the example for `chain` should compile then. Just as an aside, I was searching the terms `concat` and `flatten ` when I was looking for this.

> 3. It's kind of hard to compare performance because of (1),
but is there
> a better way to do this?

I changed the code to pass each function a different array.

My results with -O -inline -noboundscheck:

Algorithm's Sort: 76 ms, 910 μs, and 8 hnsecs
Counting Sort   : 21 ms, 563 μs, and 9 hnsecs

Ali

Awesome

Reply via email to