Wie lässt man den GCC-Compiler die Variablenteilung in Mul umwandeln (wenn es schneller ist)
int a, b;
scanf("%d %d", &a, &b);
printf("%d\n", (unsigned int)a/(unsigned char)b);
Wenn kompiliert, habe ich ...
::00401C1E:: C70424 24304000 MOV DWORD PTR [ESP],403024 %d %d
::00401C25:: E8 36FFFFFF CALL 00401B60 scanf
::00401C2A:: 0FB64C24 1C MOVZX ECX,BYTE PTR [ESP+1C]
::00401C2F:: 8B4424 18 MOV EAX,[ESP+18]
::00401C33:: 31D2 XOR EDX,EDX
::00401C35:: F7F1 DIV ECX
::00401C37:: 894424 04 MOV [ESP+4],EAX
::00401C3B:: C70424 2A304000 MOV DWORD PTR [ESP],40302A %d\x0A
::00401C42:: E8 21FFFFFF CALL 00401B68 printf
Wird es schneller sein, wenn sich der DIV in MUL verwandelt und ein Array zum Speichern des Mulvalues verwendet? Wenn ja, wie kann der Compiler die Optimierung durchführen?
int main() {
uint a, s=0, i, t;
scanf("%d", &a);
diviuint aa = a;
t = clock();
for (i=0; i<1000000000; i++)
s += i/a;
printf("Result:%10u\n", s);
printf("Time:%12u\n", clock()-t);
return 0;
}
where diviuint (a) mache einen Speicher von 1 / a und verwende stattdessen ein Vielfaches. Mit s + = i / aa wird die Geschwindigkeit 2-mal von s + = i / a