digitalmars.D - Small performance problem
- bearophile (44/44) Oct 22 2009 In D there are several things to implement and fix that have a priority ...
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
Oct 22 2009








bearophile <bearophileHUGS lycos.com>