Só vou adicionar algo para a opção "outros idiomas".
C: Uma vez que este é apenas um exercício acadêmico que realmente não faz diferença, pensei em contribuir com algo diferente.
Compilei para a montagem sem otimizações e olhei o resultado.
O código:
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;
}
compilado com gcc tdiv.c -O1 -o tdiv.s -S
a divisão por 2:
movl $5, -4(%ebp)
movl -4(%ebp), %eax
movl %eax, %edx
shrl $31, %edx
addl %edx, %eax
sarl %eax
movl %eax, -4(%ebp)
e a multiplicação por 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)
No entanto, quando eu mudei aqueles int
s paradouble
s (que é o que provavelmente o python faria), obtive o seguinte:
divisão:
flds LC0
fstl -8(%ebp)
fldl -8(%ebp)
flds LC1
fmul %st, %st(1)
fxch %st(1)
fstpl -8(%ebp)
fxch %st(1)
multiplicação:
fstpl -16(%ebp)
fldl -16(%ebp)
fmulp %st, %st(1)
fstpl -16(%ebp)
Não fiz benchmark de nenhum deste código, mas apenas examinando o código, você pode ver que usando inteiros, a divisão por 2 é mais curta do que a multiplicação por 2. Usando duplas, a multiplicação é mais curta porque o compilador usa os opcodes de ponto flutuante do processador, que provavelmente correr mais rápido (mas na verdade eu não sei) do que não usá-los para a mesma operação. Portanto, em última análise, essa resposta mostrou que o desempenho da multiplicação por 0,5 vs. divisão por 2 depende da implementação da linguagem e da plataforma em que ela é executada. Em última análise, a diferença é insignificante e é algo com que você nunca deve se preocupar, exceto em termos de legibilidade.
Como observação lateral, você pode ver que no meu programa main()
retorna a + b
. Quando eu remover a palavra-chave volatile, você nunca adivinhará a aparência do assembly (excluindo a configuração do programa):
## 5/2
## 5*0.5
## done
movl $5, %eax
leave
ret
ele fez a divisão, multiplicação e adição em uma única instrução! Obviamente, você não precisa se preocupar com isso se o otimizador for respeitável.
Desculpe pela resposta excessivamente longa.