Просто собираюсь добавить что-то для опции «другие языки».
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
с на double
с (что, вероятно, и сделал бы 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
это делало и деление, и умножение, и сложение в одной инструкции! Очевидно, вам не нужно беспокоиться об этом, если оптимизатор является респектабельным.
Извините за слишком длинный ответ.