Small performance problem
bearophile
bearophileHUGS at lycos.com
Thu Oct 22 03:11:31 PDT 2009
In D there are several things to implement and fix that have a priority higher than tuning the performance of the DMD back-end (a work may be wasted time anyway). But arrays are common, so the following may interest anyway.
On LDC this synthetic benchmark shows the same run time with both values of the use_dynamic_array constant, while on DMD the version that uses dynamic arrays is something like 70% faster (on both D1 compiler and last D2 compiler):
version (Tango)
import tango.stdc.stdio: printf;
else
version (D_Version2)
import std.c.stdio: printf;
const bool use_dynamic_array = true; // change this
void main() {
const int n = 100_000;
const int nloop = 6_000;
int[] aux1 = new int[n];
int[] aux2 = new int[n];
static if (use_dynamic_array) {
alias aux1 a1;
alias aux2 a2;
} else {
int* a1 = aux1.ptr;
int* a2 = aux2.ptr;
}
for (int i; i < nloop; i++) {
for (int j; j < n; j++)
a1[j] += a2[j];
for (int j; j < n; j++)
a2[j] += a1[j];
}
printf("%d\n", a1[10]);
}
Asm of the inner loop with dynamic arrays (DMD):
L59: mov ECX,[EBX*4][ESI]
add [EBX*4][EDX],ECX
inc EBX
cmp EBX,0186A0h
jb L59
Asm of the inner loop with pointers (DMD):
L47: mov ESI,01Ch[ESP]
mov EAX,014h[ESP]
mov EDI,[EBX*4][ESI]
add [EBX*4][EAX],EDI
inc EBX
cmp EBX,0186A0h
jb L47
Bye,
bearophile
More information about the Digitalmars-d
mailing list