D outperformed by C++, what am I doing wrong?
ikod via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Sun Aug 13 01:27:14 PDT 2017
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
More information about the Digitalmars-d-learn
mailing list