Ich werde nur etwas für die Option "Andere Sprachen" hinzufügen.
C: Da dies nur eine akademische Übung ist, die wirklich keinen Unterschied macht, dachte ich, ich würde etwas anderes beitragen.
Ich habe ohne Optimierungen zur Montage kompiliert und mir das Ergebnis angesehen.
Der Code:
int main() {
volatile int a;
volatile int b;
asm("## 5/2\n");
a = 5;
a = a / 2;
asm("## 5*0.5");
b = 5;
b = b * 0.5;
asm("## done");
return a + b;
}
zusammengestellt mit gcc tdiv.c -O1 -o tdiv.s -S
die Division durch 2:
movl $5, -4(%ebp)
movl -4(%ebp), %eax
movl %eax, %edx
shrl $31, %edx
addl %edx, %eax
sarl %eax
movl %eax, -4(%ebp)
und die Multiplikation mit 0,5:
movl $5, -8(%ebp)
movl -8(%ebp), %eax
pushl %eax
fildl (%esp)
leal 4(%esp), %esp
fmuls LC0
fnstcw -10(%ebp)
movzwl -10(%ebp), %eax
orw $3072, %ax
movw %ax, -12(%ebp)
fldcw -12(%ebp)
fistpl -16(%ebp)
fldcw -10(%ebp)
movl -16(%ebp), %eax
movl %eax, -8(%ebp)
Als ich diese int
s jedoch in ändertedouble
s (was Python wahrscheinlich tun würde), bekam ich Folgendes:
Aufteilung:
flds LC0
fstl -8(%ebp)
fldl -8(%ebp)
flds LC1
fmul %st, %st(1)
fxch %st(1)
fstpl -8(%ebp)
fxch %st(1)
Multiplikation:
fstpl -16(%ebp)
fldl -16(%ebp)
fmulp %st, %st(1)
fstpl -16(%ebp)
Ich habe keinen dieser Codes bewertet, aber wenn Sie den Code untersuchen, können Sie feststellen, dass die Division durch 2 bei Verwendung von ganzen Zahlen kürzer ist als die Multiplikation mit 2. Bei der Verwendung von Doubles ist die Multiplikation kürzer, da der Compiler die Gleitkomma-Opcodes des Prozessors verwendet wahrscheinlich schneller laufen (aber eigentlich weiß ich es nicht) als sie nicht für den gleichen Vorgang zu verwenden. Letztendlich hat diese Antwort gezeigt, dass die Leistung der Multiplikation mit 0,5 gegenüber der Division durch 2 von der Implementierung der Sprache und der Plattform abhängt, auf der sie ausgeführt wird. Letztendlich ist der Unterschied vernachlässigbar und sollte Sie sich so gut wie nie Sorgen machen, außer in Bezug auf die Lesbarkeit.
Als Randnotiz können Sie sehen, dass in meinem Programm main()
zurückkehrt a + b
. Wenn ich das flüchtige Schlüsselwort wegnehme, werden Sie nie erraten, wie die Assembly aussieht (mit Ausnahme des Programm-Setups):
## 5/2
## 5*0.5
## done
movl $5, %eax
leave
ret
es hat sowohl die Division, Multiplikation als auch Addition in einer einzigen Anweisung durchgeführt! Natürlich müssen Sie sich darüber keine Sorgen machen, wenn der Optimierer respektabel ist.
Entschuldigung für die zu lange Antwort.