Programming language benchmark
bearophile
bearophileHUGS at lycos.com
Fri Jun 24 18:27:27 PDT 2011
Don:
Sorry for my slow answer, I was quite busy for days.
> I've never heard that claim before. Do you have evidence for that?
I compare/convert code to D every day, so I am aware that D code compiled with DMD is often slower than C/C++ code compiled with GCC. Since some years I even keep a collection of snippets of slow code.
But I am also aware that the low performance has many different causes, like some missing inlining, missing loop unrolling, etc, so spotting a clear and small case of integer arithmetic code that causes a slow down, to give you evidence, is not easy. So I am sorry for my overly broad claim.
>If it is true, there's a strong possibility that it's a small, fixable issue (for example, DMD used to have terrible performance for ulong multiplication).<
You are right, the case I'm going to show is a precise problem that's fixable.
-----------------------
// C code
#include "limits.h"
#include "stdio.h"
int divideBySeven(int x) {
return x / 7;
}
int main() {
int i = INT_MAX;
int r;
while (i--)
r = divideBySeven(i);
printf("%d\n", r);
return 0;
}
-----------------------
// D code
int divideBySeven(int x) {
return x / 7;
}
void main() {
int i = int.max;
int r;
while (i--)
r = divideBySeven(i);
printf("%d\n", r);
}
-----------------------
Asm from the C version:
_divideBySeven:
pushl %ebx
movl $-1840700269, %ebx
movl 8(%esp), %ecx
movl %ebx, %eax
popl %ebx
imull %ecx
leal (%edx,%ecx), %eax
sarl $31, %ecx
sarl $2, %eax
subl %ecx, %eax
ret
_main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebx
movl $-1840700269, %ebx
pushl %ecx
subl $20, %esp
call ___main
movl $2147483646, %ecx
.p2align 4,,10
L4:
movl %ecx, %eax
imull %ebx
movl %ecx, %eax
addl %ecx, %edx
sarl $31, %eax
sarl $2, %edx
decl %ecx
subl %eax, %edx
cmpl $-1, %ecx
jne L4
movl %edx, 4(%esp)
movl $LC0, (%esp)
call _printf
addl $20, %esp
xorl %eax, %eax
popl %ecx
popl %ebx
leal -4(%ecx), %esp
ret
.def _printf; .scl 2; .type 32; .endef
-----------------------
Asm from the D version:
_D9int_div_d13divideBySevenFiZi comdat
mov ECX,7
cdq
idiv ECX
ret
__Dmain comdat
L0: push EAX
push EBX
mov EBX,07FFFFFFFh
push ESI
xor ESI,ESI
test EBX,EBX
lea EBX,-1[EBX]
je L24
L11: mov EAX,EBX
mov ECX,7
cdq
idiv ECX
test EBX,EBX
mov ESI,EAX
lea EBX,-1[EBX]
jne L11
L24: push ESI
mov EDX,offset FLAT:_DATA
push EDX
call near ptr _printf
add ESP,8
xor EAX,EAX
pop ESI
pop EBX
pop ECX
ret
-----------------------
For a more real case see:
http://d.puremagic.com/issues/show_bug.cgi?id=5607
Bye,
bearophile
More information about the Digitalmars-d
mailing list