Solo voy a agregar algo para la opción "otros idiomas".
C: Dado que este es solo un ejercicio académico que realmente no hace ninguna diferencia, pensé en contribuir con algo diferente.
Compilé para ensamblar sin optimizaciones y miré el resultado.
El 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 con gcc tdiv.c -O1 -o tdiv.s -S
la división 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)
y la multiplicación 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)
Sin embargo, cuando cambié esos int
sa double
s (que es lo que probablemente haría Python), obtuve esto:
división:
flds LC0
fstl -8(%ebp)
fldl -8(%ebp)
flds LC1
fmul %st, %st(1)
fxch %st(1)
fstpl -8(%ebp)
fxch %st(1)
multiplicación:
fstpl -16(%ebp)
fldl -16(%ebp)
fmulp %st, %st(1)
fstpl -16(%ebp)
No he comparado ninguno de este código, pero con solo examinar el código puede ver que al usar números enteros, la división por 2 es más corta que la multiplicación por 2. Al usar dobles, la multiplicación es más corta porque el compilador usa los códigos de operación de punto flotante del procesador, que probablemente corran más rápido (pero en realidad no lo sé) que no usarlos para la misma operación. Entonces, en última instancia, esta respuesta ha demostrado que el rendimiento de la multiplacción por 0.5 frente a la división por 2 depende de la implementación del lenguaje y la plataforma en la que se ejecuta. En última instancia, la diferencia es insignificante y es algo de lo que prácticamente nunca debería preocuparse, excepto en términos de legibilidad.
Como nota al margen, puedes ver que en mi programa main()
regresa a + b
. Cuando elimino la palabra clave volátil, nunca adivinará cómo se ve el ensamblaje (excluyendo la configuración del programa):
## 5/2
## 5*0.5
## done
movl $5, %eax
leave
ret
¡Hizo tanto la división, la multiplicación y la suma en una sola instrucción! Claramente, no tiene que preocuparse por esto si el optimizador es respetable.
Perdón por la respuesta demasiado larga.