Zamierzam tylko dodać coś dla opcji „inne języki”.
C: Ponieważ to jest tylko ćwiczenie akademickie, to naprawdę nie robi różnicy, pomyślałem, że wniesie coś innego.
Skompilowałem do assemblacji bez optymalizacji i spojrzałem na wynik.
Kod:
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;
}
skompilowane z gcc tdiv.c -O1 -o tdiv.s -S
podział na 2:
movl $5, -4(%ebp)
movl -4(%ebp), %eax
movl %eax, %edx
shrl $31, %edx
addl %edx, %eax
sarl %eax
movl %eax, -4(%ebp)
i pomnożenie przez 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)
Jednak kiedy zmieniłem te int
nadouble
s (co prawdopodobnie zrobiłby Python), otrzymałem to:
podział:
flds LC0
fstl -8(%ebp)
fldl -8(%ebp)
flds LC1
fmul %st, %st(1)
fxch %st(1)
fstpl -8(%ebp)
fxch %st(1)
mnożenie:
fstpl -16(%ebp)
fldl -16(%ebp)
fmulp %st, %st(1)
fstpl -16(%ebp)
Nie testowałem żadnego z tego kodu, ale po zbadaniu kodu widać, że przy użyciu liczb całkowitych dzielenie przez 2 jest krótsze niż mnożenie przez 2. Używając podwójnych, mnożenie jest krótsze, ponieważ kompilator używa zmiennoprzecinkowych opkodów procesora, które prawdopodobnie działają szybciej (ale właściwie nie wiem) niż nie używam ich do tej samej operacji. Ostatecznie więc ta odpowiedź pokazała, że wydajność mnożenia przez 0,5 w porównaniu z dzieleniem przez 2 zależy od implementacji języka i platformy, na której działa. Ostatecznie różnica jest znikoma i jest czymś, o co praktycznie nigdy nie powinieneś się martwić, z wyjątkiem czytelności.
Na marginesie, możesz zobaczyć, że w moim programie main()
powraca a + b
. Kiedy usuwam słowo kluczowe volatile, nigdy nie zgadniesz, jak wygląda zestaw (wyłączając konfigurację programu):
## 5/2
## 5*0.5
## done
movl $5, %eax
leave
ret
wykonał zarówno dzielenie, mnożenie, jak i dodawanie w jednej instrukcji! Oczywiście nie musisz się tym martwić, jeśli optymalizator jest godny szacunku.
Przepraszam za zbyt długą odpowiedź.