"Diğer diller" seçeneği için bir şeyler ekleyeceğim.
C: Bu gerçekten fark yaratmayan akademik bir alıştırma olduğu için , farklı bir şeye katkıda bulunacağımı düşündüm.
Optimizasyon yapmadan montaj için derledim ve sonuca baktım.
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;
}
ile derlendi gcc tdiv.c -O1 -o tdiv.s -S
2'ye bölme:
movl $5, -4(%ebp)
movl -4(%ebp), %eax
movl %eax, %edx
shrl $31, %edx
addl %edx, %eax
sarl %eax
movl %eax, -4(%ebp)
ve 0,5 ile çarpma:
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)
Ancak, bunları int
s olarak değiştirdiğimde double
(ki bu muhtemelen python'un yapacağı şeydir), şunu elde ettim:
bölünme:
flds LC0
fstl -8(%ebp)
fldl -8(%ebp)
flds LC1
fmul %st, %st(1)
fxch %st(1)
fstpl -8(%ebp)
fxch %st(1)
çarpma işlemi:
fstpl -16(%ebp)
fldl -16(%ebp)
fmulp %st, %st(1)
fstpl -16(%ebp)
Bu kodun hiçbirini karşılaştırmadım, ancak sadece kodu inceleyerek, 2'ye bölmenin 2 ile çarpmadan daha kısa olduğunu görebilirsiniz. Çiftler kullanıldığında, çarpma daha kısadır çünkü derleyici işlemcinin kayan noktalı işlem kodlarını kullanır. muhtemelen aynı işlem için kullanmamaktan daha hızlı koşar (ama aslında bilmiyorum). Sonuç olarak, bu cevap, çoklu işlemin performansının 0,5'e karşı 2'ye bölünmesinin, dilin uygulanmasına ve üzerinde çalıştığı platforma bağlı olduğunu göstermiştir. Sonuçta, fark önemsizdir ve okunabilirlik dışında, neredeyse asla endişelenmemeniz gereken bir şeydir.
Bir yan not olarak, programımın main()
geri döndüğünü görebilirsiniz a + b
. Uçucu anahtar kelimeyi elimden aldığımda, derlemenin neye benzediğini asla tahmin edemezsiniz (program kurulumu hariç):
## 5/2
## 5*0.5
## done
movl $5, %eax
leave
ret
hem bölmeyi, hem çarpmayı hem de toplamayı tek bir talimatta yaptı! Optimize edici herhangi bir saygıdeğer ise, bunun için endişelenmenize gerek yok.
Aşırı uzun cevap için özür dilerim.