Hanya akan menambahkan sesuatu untuk opsi "bahasa lain".
C: Karena ini hanya latihan akademis yang benar - benar tidak ada bedanya, saya pikir saya akan memberikan kontribusi yang berbeda.
Saya menyusun untuk berkumpul tanpa optimasi dan melihat hasilnya.
Kode:
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;
}
dikompilasi dengan gcc tdiv.c -O1 -o tdiv.s -S
pembagian dengan 2:
movl $5, -4(%ebp)
movl -4(%ebp), %eax
movl %eax, %edx
shrl $31, %edx
addl %edx, %eax
sarl %eax
movl %eax, -4(%ebp)
dan perkalian dengan 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)
Namun, ketika saya mengubahnya int
menjadi double
s (yang mungkin akan dilakukan python), saya mendapatkan ini:
divisi:
flds LC0
fstl -8(%ebp)
fldl -8(%ebp)
flds LC1
fmul %st, %st(1)
fxch %st(1)
fstpl -8(%ebp)
fxch %st(1)
perkalian:
fstpl -16(%ebp)
fldl -16(%ebp)
fmulp %st, %st(1)
fstpl -16(%ebp)
Saya belum membandingkan kode ini, tetapi hanya dengan memeriksa kode Anda dapat melihat bahwa menggunakan bilangan bulat, pembagian dengan 2 lebih pendek daripada perkalian dengan 2. Menggunakan penggandaan, perkalian lebih pendek karena kompilator menggunakan opcode titik mengambang prosesor, yang mana mungkin berjalan lebih cepat (tapi sebenarnya saya tidak tahu) daripada tidak menggunakannya untuk operasi yang sama. Jadi pada akhirnya jawaban ini telah menunjukkan bahwa kinerja perkalian dengan 0,5 vs. pembagian dengan 2 bergantung pada implementasi bahasa dan platform tempat menjalankannya. Pada akhirnya perbedaan tersebut dapat diabaikan dan merupakan sesuatu yang sebenarnya tidak pernah Anda khawatirkan, kecuali dalam hal keterbacaan.
Sebagai catatan tambahan, Anda dapat melihat bahwa di program saya main()
kembali a + b
. Ketika saya mengambil kata kunci yang mudah menguap, Anda tidak akan pernah menebak seperti apa rakitan itu (tidak termasuk pengaturan program):
## 5/2
## 5*0.5
## done
movl $5, %eax
leave
ret
itu melakukan baik pembagian, perkalian, DAN penambahan dalam satu instruksi! Jelas Anda tidak perlu khawatir tentang ini jika pengoptimal adalah jenis yang terhormat.
Maaf atas jawaban yang terlalu panjang.