<div dir="ltr"><div>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)</div><div><br></div><div>import std.stdio : writeln;</div><div>import std.algorithm.comparison: min;</div><div>import std.algorithm.iteration: sum;</div><div>import core.time: MonoTime, Duration;</div><div><br></div><div><br></div><div>T[] sum_subranges(T)(T[] input, uint range)</div><div>{</div><div> import std.array : appender;</div><div> auto app = appender!(T[])();</div><div> if (range == 0)</div><div> {</div><div> return app.data;</div><div> }</div><div> for (uint i; i < input.length; i=min(i+range, input.length))</div><div> {</div><div> app.put(sum(input[i..min(i+range, input.length)]));</div><div> }</div><div> return app.data;</div><div>}</div><div><br></div><div>unittest</div><div>{</div><div> assert(sum_subranges([1,1,1], 2) == [2, 1]);</div><div> assert(sum_subranges([1,1,1,2,3,3], 2) == [2, 3, 6]);</div><div> assert(sum_subranges([], 2) == []);</div><div> assert(sum_subranges([1], 2) == [1]);</div><div> assert(sum_subranges([1], 0) == []);</div><div>}</div><div><br></div><div><br></div><div>int main()</div><div>{</div><div> import std.range : iota, array;</div><div> auto v = iota(0,1000000).array;</div><div> int sum;</div><div> MonoTime beg = MonoTime.currTime;</div><div> for (int i=0; i < 100; i++)</div><div> sum += cast(int)sum_subranges(v,2).length;</div><div> MonoTime end = MonoTime.currTime;</div><div> writeln(end-beg);</div><div> writeln(sum);</div><div> return sum;</div><div>}</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Aug 13, 2017 at 9:03 AM, Neia Neutuladh 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 06:09:39 UTC, amfvcg wrote:<br>
</span><span class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi all,<br>
I'm solving below task:<br>
</blockquote>
<br></span>
Well, for one thing, you are preallocating in C++ code but not in D.<br>
<br>
On my machine, your version of the code completes in 3.175 seconds. Changing it a little reduces it to 0.420s:<br>
<br>
T[] result = new T[input.length];<br>
size_t o = 0;<span class=""><br>
for (uint i; i < input.length; i=min(i+range, input.length))<br>
{<br></span>
result[o] = sum(input[i..min(i+range, input.length)]);<br>
o++;<br>
}<br>
return result[0..o];<br>
<br>
You can also use Appender from std.array.<br>
</blockquote></div><br></div>