แค่จะเพิ่มบางอย่างสำหรับตัวเลือก "ภาษาอื่น ๆ "
C: เนื่องจากนี่เป็นเพียงแบบฝึกหัดทางวิชาการที่ไม่สร้างความแตกต่างฉันจึงคิดว่าจะมีส่วนร่วมในสิ่งที่แตกต่าง
ฉันรวบรวมเพื่อประกอบโดยไม่มีการปรับให้เหมาะสมและดูที่ผลลัพธ์
รหัส:
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;
}
รวบรวมด้วย gcc tdiv.c -O1 -o tdiv.s -S
หารด้วย 2:
movl $5, -4(%ebp)
movl -4(%ebp), %eax
movl %eax, %edx
shrl $31, %edx
addl %edx, %eax
sarl %eax
movl %eax, -4(%ebp)
และการคูณด้วย 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)
อย่างไรก็ตามเมื่อฉันเปลี่ยนint
s เป็นdouble
s (ซึ่งเป็นสิ่งที่ python น่าจะทำ) ฉันได้รับสิ่งนี้:
แผนก:
flds LC0
fstl -8(%ebp)
fldl -8(%ebp)
flds LC1
fmul %st, %st(1)
fxch %st(1)
fstpl -8(%ebp)
fxch %st(1)
คูณ:
fstpl -16(%ebp)
fldl -16(%ebp)
fmulp %st, %st(1)
fstpl -16(%ebp)
ฉันไม่ได้เปรียบเทียบโค้ดนี้เลย แต่เพียงแค่ตรวจสอบโค้ดคุณจะเห็นว่าการใช้จำนวนเต็มการหารด้วย 2 นั้นสั้นกว่าการคูณด้วย 2 การใช้ doubles การคูณจะสั้นกว่าเนื่องจากคอมไพเลอร์ใช้ opcodes จุดลอยตัวของโปรเซสเซอร์ซึ่ง อาจทำงานได้เร็วกว่า (แต่จริงๆแล้วฉันไม่รู้) มากกว่าที่จะไม่ใช้สำหรับการทำงานเดียวกัน ในที่สุดคำตอบนี้แสดงให้เห็นว่าประสิทธิภาพของการคูณด้วย 0.5 เทียบกับการหารด้วย 2 นั้นขึ้นอยู่กับการใช้งานภาษาและแพลตฟอร์มที่ทำงาน ท้ายที่สุดแล้วความแตกต่างเป็นเรื่องเล็กน้อยและเป็นสิ่งที่คุณแทบจะไม่เคยกังวลเลยยกเว้นในแง่ของความสามารถในการอ่าน
ตามบันทึกข้างคุณจะเห็นว่าในโปรแกรมของฉันผลตอบแทนmain()
a + b
เมื่อฉันนำคีย์เวิร์ดที่ระเหยออกไปคุณจะไม่มีทางเดาได้เลยว่าแอสเซมบลีมีลักษณะอย่างไร (ไม่รวมการตั้งค่าโปรแกรม):
## 5/2
## 5*0.5
## done
movl $5, %eax
leave
ret
มันทำทั้งการหารการคูณและการบวกในคำสั่งเดียว! เห็นได้ชัดว่าคุณไม่ต้องกังวลเกี่ยวกับเรื่องนี้หากเครื่องมือเพิ่มประสิทธิภาพเป็นสิ่งที่น่านับถือ
ขออภัยสำหรับคำตอบที่ยาวเกินไป