On Sunday, 13 August 2017 at 08:13:56 UTC, amfvcg wrote:
On Sunday, 13 August 2017 at 08:00:53 UTC, Daniel Kozak wrote:
my second version on ldc takes 380ms and c++ version on same compiler (clang), takes 350ms, so it seems to be almost same


Ok, on ideone (ldc 1.1.0) it timeouts, on dpaste (ldc 0.12.0) it gets killed.
What version are you using?

Either way, if that'd be the case - that's slick. (and ldc would be the compiler of choice for real use cases).

import std.stdio : writeln;
import std.algorithm.comparison: min;
import std.algorithm.iteration: sum;
import core.time: MonoTime, Duration;
import std.range;
import std.algorithm;

auto s1(T)(T input, uint r) {
    return input.chunks(r).map!sum;
}

T[] sum_subranges(T)(T[] input, uint range)
{
    T[] result;
    if (range == 0)
    {
        return result;
    }
    for (uint i; i < input.length; i=min(i+range, input.length))
    {
        result ~= sum(input[i..min(i+range, input.length)]);
    }
    return result;
}

unittest
{
    assert(sum_subranges([1,1,1], 2) == [2, 1]);
    assert(sum_subranges([1,1,1,2,3,3], 2) == [2, 3, 6]);
    assert(sum_subranges([], 2) == []);
    assert(sum_subranges([1], 2) == [1]);
    assert(sum_subranges([1], 0) == []);
    assert(s1([1,1,1], 2).array == [2, 1]);
    assert(s1([1,1,1,2,3,3], 2).array == [2, 3, 6]);
}
int main()
{
    int sum;
    MonoTime beg0 = MonoTime.currTime;
    for (int i=0; i < 100; i++)
        sum += s1(iota(1000000),2).length;
    MonoTime end0 = MonoTime.currTime;
    writeln(end0-beg0);
    writeln(sum);

    sum = 0;
    int[1000000] v;
    for (int i=0; i < 1000000; ++i)
        v[i] = i;
    MonoTime beg = MonoTime.currTime;
    for (int i=0; i < 100; i++)
        sum += cast(int)sum_subranges(v,2).length;
    MonoTime end = MonoTime.currTime;
    writeln(end-beg);
    writeln(sum);
    return sum;
}

Gives me

5 μs and 2 hnsecs
50000000
3 secs, 228 ms, 837 μs, and 4 hnsecs
50000000

Reply via email to