A little class benchmark
bearophile
bearophileHUGS at lycos.com
Thu Oct 14 16:00:55 PDT 2010
I have found a little benchmark on the StackOverflow site:
http://stackoverflow.com/questions/3930813/optimization-of-access-to-members-in-c
I have written a D2 version that compares few alternatives:
import std.c.stdio: printf;
final class Tester {
this(int[] arr_) {
arr = arr_;
}
int doAdd1() {
tot = 0;
for (int i = 0; i < arr.length; i++)
tot += arr[i];
return tot;
}
int doAdd2() {
tot = 0;
foreach (x; arr)
tot += x;
return tot;
}
int doAdd3() {
int sum = 0;
foreach (x; arr)
sum += x;
tot = sum;
return tot;
}
int doAdd4() {
int sum = 0;
immutable int len = arr.length;
for (int i = 0; i < len; i++)
sum += arr[i];
tot = sum;
return tot;
}
protected:
int[] arr;
int tot;
}
void main() {}
The asm produced by the latest dmd2, optimized build:
Inner loop of Tester.doAdd1:
L10: mov EDX,0Ch[EBX]
mov ECX,[ESI*4][EDX]
inc ESI
add 010h[EBX],ECX
mov EAX,8[EBX]
cmp 8[EBX],ESI
ja L10
Inner loop of Tester.doAdd2:
L30: mov EAX,[EDX*4][EBX]
inc EDX
add 010h[ESI],EAX
cmp EDX,EDI
jb L30
Inner loop of Tester.doAdd3:
L2E: add ECX,[EDX*4][EBX]
inc EDX
cmp EDX,010h[ESP]
jb L2E
Inner loop of Tester.doAdd4:
L11: mov EDX,0Ch[EDI]
mov EAX,8[EDI]
add EBX,[ESI*4][EDX]
inc ESI
cmp ESI,EBP
jl L11
Do you know why the compiler uses the instance attribute inside the loop, instead of a copy of it?
Bye,
bearophile
More information about the Digitalmars-d
mailing list