Code runtime
John Colvin via Digitalmars-d
digitalmars-d at puremagic.com
Sun Jun 5 15:34:47 PDT 2016
On Sunday, 5 June 2016 at 21:52:20 UTC, Ausprobierer wrote:
> I've written this simple piece of code:
>
> [CODE]
> import std.algorithm;
> import std.array;
> import std.conv;
> import std.datetime;
> import std.parallelism;
> import std.range;
> import std.stdio;
> import core.atomic;
> import core.thread;
>
> void main()
> {
> immutable long n = 11;
>
> long[] z = [1,1,2,2,3,3,4,4,5,5,6,6,0,0];
> long j = 0;
> long l = z.length;
>
> StopWatch w; w.reset(); w.start;
>
> do
> {
> if (z[0] == 0) break; else
> {
>
> long m = 0;
> for (long i = 0; i < z.length; i += 2)
> {
> m += (z[i]*10 + z[i+1]);
> }
> if (m % n == 0) j++;
> }
> }
> while (nextPermutation(z));
>
> w.stop();
> j.writeln;
> w.peek().msecs.writeln;
> }
> [/CODE]
>
> I've compiled it with "dmd -m64 -release -inline <filename>.d".
> Output is 58679513, and it takes around 52 seconds to run.
>
> Then I've replicated this code in MSVS2015 C++:
>
> [CODE]
> #include <algorithm>
> #include <iostream>
> #include <ctime>
>
> using namespace std;
>
> const long N = 11;
>
> long Z[] = { 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 0, 0 };
> long L = sizeof(Z) / sizeof(Z[0]);
>
> int main(void)
> {
> long j = 0;
>
> clock_t t = clock();
>
> do {
> if (Z[0] == 0) break;
>
> long m = 0;
> for (long i = 0; i < L; i += 2) {
> m += (Z[i] * 10 + Z[i + 1]);
> }
>
> if (m % N == 0) {
> j++;
> }
> } while (next_permutation(Z, Z+L));
>
> t = clock() - t;
>
> cout << j << endl;
> cout << (float(t)) / CLOCKS_PER_SEC << endl;
>
> return 0;
> }
> [/CODE]
>
> Compile mode is also Release/x64. I've run the program and was
> eagerly surprised, not to say stunned. The output is also
> 58679513, but it's done in under 6 seconds!
>
> Care to explain? I haven't found a solution to this :(
On OS X using ldc and clang, I get C++: ~6s and D: ~7s. The
slowdown in D seems to be due to parts of nextPermutation not
ending up inlined.
Be careful with benchmarks like this, you are giving the compiler
a lot more information than it usually has in any real world case
(here it knows the exact values of all the input
data/parameters!).
More information about the Digitalmars-d
mailing list