A significant performance difference
safety0ff via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Mon Sep 1 04:46:50 PDT 2014
The following D code runs over 2x faster than the C++ code
(comparing dmd no options to g++ no options.) Its not a fair
comparison because it changes the order of operations.
import core.stdc.stdio;
const uint H = 9, W = 12;
const uint[3][6] g = [[7, 0, H - 3],
[1 + (1 << H) + (1 << (2 * H)), 0, H - 1],
[3 + (1 << H), 0, H - 2],
[3 + (2 << H), 0, H - 2],
[1 + (1 << H) + (2 << H), 0, H - 2],
[1 + (1 << H) + (1 << (H - 1)), 1, H - 1]];
int main() {
ulong p, i, k;
ulong[uint] x, y;
uint l;
x[0] = 1;
for (i = 0; i < W; ++i) {
y = null;
while (x.length)
foreach (j; x.keys) {
p = x[j];
x.remove(j);
for (k = 0; k < H; ++k)
if ((j & (1 << k)) == 0)
break;
if (k == H)
y[j >> H] += p;
else
for (l = 0; l < 6; ++l)
if (k >= g[l][1] && k <= g[l][2])
if ((j & (g[l][0] << k)) == 0)
x[j + (g[l][0] << k)] += p;
}
x = y;
}
printf("%lld\n", y[0]);
return 0;
}
More information about the Digitalmars-d-learn
mailing list