Просто додамо щось для параметра "інші мови".
С: Оскільки це справді лише академічна вправа не має ніякого значення, я подумав, що буду сприяти чомусь іншому.
Я збирався на збірку без оптимізацій і дивився на результат.
Код:
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
з до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. Використання подвійних значень множення коротше, оскільки компілятор використовує опкоди з плаваючою комою процесора, які ймовірно, працює швидше (але насправді я не знаю), ніж не використовувати їх для тієї ж операції. Отже в кінцевому підсумку ця відповідь показала, що ефективність множини на 0,5 проти ділення на 2 залежить від реалізації мови та платформи, на якій вона працює. Зрештою, різниця незначна, і це те, про що ви практично ніколи не повинні турбуватися, крім випадків читабельності.
Як бічну примітку ви бачите, що в моїй програмі main()
повертається a + b
. Коли я знімаю мінливе ключове слово, ви ніколи не здогадаєтесь, як виглядає збірка (виключаючи налаштування програми):
## 5/2
## 5*0.5
## done
movl $5, %eax
leave
ret
це робило як ділення, множення, так і додавання в одній інструкції! Зрозуміло, що вам не доведеться турбуватися з цього приводу, якщо оптимізатор будь-якого респектабельного.
Вибачте за занадто довгу відповідь.