<div dir="ltr">my second version on ldc takes 380ms and c++ version on same compiler (clang), takes 350ms, so it seems to be almost same</div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Aug 13, 2017 at 9:51 AM, amfvcg via Digitalmars-d-learn <span dir="ltr"><<a href="mailto:digitalmars-d-learn@puremagic.com" target="_blank">digitalmars-d-learn@puremagic.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On Sunday, 13 August 2017 at 07:30:32 UTC, Daniel Kozak wrote:<br>
</span><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">
Here is more D idiomatic way:<br>
<br></span><span class="">
import std.stdio : writeln;<br>
import std.algorithm.comparison: min;<br>
import std.algorithm.iteration: sum;<br>
import core.time: MonoTime, Duration;<br>
<br>
<br></span><span class="">
auto sum_subranges(T)(T input, uint range)<br>
{<br>
    import std.array : array;<br>
    import std.range : chunks, ElementType;<br>
    import std.algorithm : map;<br>
<br></span>
    if (range == 0)<br>
    {<br>
        return ElementType!(T)[].init;<br>
    }<br>
    return input.chunks(range).map!(sum).<wbr>array;<span class=""><br>
}<br>
<br>
unittest<br>
{<br>
    assert(sum_subranges([1,1,1], 2) == [2, 1]);<br>
    assert(sum_subranges([1,1,1,2,<wbr>3,3], 2) == [2, 3, 6]);<br>
    assert(sum_subranges([], 2) == []);<br>
    assert(sum_subranges([1], 2) == [1]);<br>
    assert(sum_subranges([1], 0) == []);<br>
}<br>
<br>
<br>
int main()<br>
{<br>
    import std.range : iota, array;<br></span>
    auto v = iota(0,1000000);<span class=""><br>
    int sum;<br>
    MonoTime beg = MonoTime.currTime;<br>
    for (int i=0; i < 100; i++)<br>
        sum += cast(int)sum_subranges(v,2).le<wbr>ngth;<br>
    MonoTime end = MonoTime.currTime;<br>
    writeln(end-beg);<br>
    writeln(sum);<br>
    return sum;<br>
}<br>
<br></span><span class="">
On Sun, Aug 13, 2017 at 9:13 AM, Daniel Kozak <<a href="mailto:kozzi11@gmail.com" target="_blank">kozzi11@gmail.com</a>> wrote:<br>
<br>
</span><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="h5">
this works ok for me with ldc compiler, gdc does not work on my arch machine so I can not do comparsion to your c++ versin (clang does not work with your c++ code)<br>
<br>
import std.stdio : writeln;<br>
import std.algorithm.comparison: min;<br>
import std.algorithm.iteration: sum;<br>
import core.time: MonoTime, Duration;<br>
<br>
<br>
T[] sum_subranges(T)(T[] input, uint range)<br>
{<br>
    import std.array : appender;<br>
    auto app = appender!(T[])();<br>
    if (range == 0)<br>
    {<br>
        return app.data;<br>
    }<br>
    for (uint i; i < input.length; i=min(i+range, input.length))<br>
    {<br>
        app.put(sum(input[i..min(i+ran<wbr>ge, input.length)]));<br>
    }<br>
    return app.data;<br>
}<br>
<br>
unittest<br>
{<br>
    assert(sum_subranges([1,1,1], 2) == [2, 1]);<br>
    assert(sum_subranges([1,1,1,2,<wbr>3,3], 2) == [2, 3, 6]);<br>
    assert(sum_subranges([], 2) == []);<br>
    assert(sum_subranges([1], 2) == [1]);<br>
    assert(sum_subranges([1], 0) == []);<br>
}<br>
<br>
<br>
int main()<br>
{<br>
    import std.range : iota, array;<br>
    auto v = iota(0,1000000).array;<br>
    int sum;<br>
    MonoTime beg = MonoTime.currTime;<br>
    for (int i=0; i < 100; i++)<br>
        sum += cast(int)sum_subranges(v,2).le<wbr>ngth;<br>
    MonoTime end = MonoTime.currTime;<br>
    writeln(end-beg);<br>
    writeln(sum);<br>
    return sum;<br>
}<br>
<br>
On Sun, Aug 13, 2017 at 9:03 AM, Neia Neutuladh via Digitalmars-d-learn < <a href="mailto:digitalmars-d-learn@puremagic.com" target="_blank">digitalmars-d-learn@puremagic.<wbr>com</a>> wrote:<br>
<br>
</div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
[...]<br>
</blockquote></blockquote></blockquote>
<br>
Thank you all for the replies. Good to know the community is alive in d :)<br>
<br>
Let's settle the playground:<br>
D  : <a href="http://ideone.com/h4fnsD" rel="noreferrer" target="_blank">http://ideone.com/h4fnsD</a><br>
C++: <a href="http://ideone.com/X1pyXG" rel="noreferrer" target="_blank">http://ideone.com/X1pyXG</a><br>
<br>
Both using GCC under the hood.<br>
C++ in 112 ms;<br>
D in :<br>
- 2.5 sec with original source;<br>
- 2.5 sec with Daniel's 1st version;<br>
- 5 sec timeout exceeded with Daniel's 2nd version;<br>
- 1.8 sec with Neia-like preallocation;<br>
<br>
So still it's not that neaty.<br>
<br>
(What's interesting C++ code generates 2KLOC of assembly, and Dlang @ ldc 12KLOC - checked at godbolt).<br>
<br>
P.S. For C++ version to work under clang, the function which takes (BinaryOp) must go before the other one (my bad).<br>
</blockquote></div><br></div>