this one is even faster than c++: http://ideone.com/TRDsOo
On Sun, Aug 13, 2017 at 10:00 AM, Daniel Kozak <kozz...@gmail.com> wrote: > my second version on ldc takes 380ms and c++ version on same compiler > (clang), takes 350ms, so it seems to be almost same > > On Sun, Aug 13, 2017 at 9:51 AM, amfvcg via Digitalmars-d-learn < > digitalmars-d-learn@puremagic.com> wrote: > >> On Sunday, 13 August 2017 at 07:30:32 UTC, Daniel Kozak wrote: >> >>> Here is more D idiomatic way: >>> >>> import std.stdio : writeln; >>> import std.algorithm.comparison: min; >>> import std.algorithm.iteration: sum; >>> import core.time: MonoTime, Duration; >>> >>> >>> auto sum_subranges(T)(T input, uint range) >>> { >>> import std.array : array; >>> import std.range : chunks, ElementType; >>> import std.algorithm : map; >>> >>> if (range == 0) >>> { >>> return ElementType!(T)[].init; >>> } >>> return input.chunks(range).map!(sum).array; >>> } >>> >>> 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) == []); >>> } >>> >>> >>> int main() >>> { >>> import std.range : iota, array; >>> auto v = iota(0,1000000); >>> int sum; >>> 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; >>> } >>> >>> On Sun, Aug 13, 2017 at 9:13 AM, Daniel Kozak <kozz...@gmail.com> wrote: >>> >>> 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) >>>> >>>> import std.stdio : writeln; >>>> import std.algorithm.comparison: min; >>>> import std.algorithm.iteration: sum; >>>> import core.time: MonoTime, Duration; >>>> >>>> >>>> T[] sum_subranges(T)(T[] input, uint range) >>>> { >>>> import std.array : appender; >>>> auto app = appender!(T[])(); >>>> if (range == 0) >>>> { >>>> return app.data; >>>> } >>>> for (uint i; i < input.length; i=min(i+range, input.length)) >>>> { >>>> app.put(sum(input[i..min(i+range, input.length)])); >>>> } >>>> return app.data; >>>> } >>>> >>>> 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) == []); >>>> } >>>> >>>> >>>> int main() >>>> { >>>> import std.range : iota, array; >>>> auto v = iota(0,1000000).array; >>>> int sum; >>>> 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; >>>> } >>>> >>>> On Sun, Aug 13, 2017 at 9:03 AM, Neia Neutuladh via Digitalmars-d-learn >>>> < digitalmars-d-learn@puremagic.com> wrote: >>>> >>>> [...] >>>>> >>>> >> Thank you all for the replies. Good to know the community is alive in d :) >> >> Let's settle the playground: >> D : http://ideone.com/h4fnsD >> C++: http://ideone.com/X1pyXG >> >> Both using GCC under the hood. >> C++ in 112 ms; >> D in : >> - 2.5 sec with original source; >> - 2.5 sec with Daniel's 1st version; >> - 5 sec timeout exceeded with Daniel's 2nd version; >> - 1.8 sec with Neia-like preallocation; >> >> So still it's not that neaty. >> >> (What's interesting C++ code generates 2KLOC of assembly, and Dlang @ ldc >> 12KLOC - checked at godbolt). >> >> P.S. For C++ version to work under clang, the function which takes >> (BinaryOp) must go before the other one (my bad). >> > >