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