Solo voy a agregar algo para la opción "otros idiomas".
C: Dado que esto es solo un ejercicio académico que realmente no hace diferencia, pensé que contribuiría con algo diferente.
Me 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é aquellos int
s a double
s (que es lo que probablemente haría pitón), tengo 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 referenciado cualquiera de este código, pero sólo examinando el código puedes ver que usar enteros, división por 2 es más corto que multiplicar por 2. Usando 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 realmente no lo sé) que no usarlos para el sam operación e Así que, 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ías preocuparte, excepto en términos de legibilidad.
Como nota al margen, puede ver que en mi programa main()
devuelve a + b
. Cuando tomo la palabra clave volátil de distancia, que no sabes lo que el ensamblaje se parece a (excluyendo la configuración del programa):
## 5/2
## 5*0.5
## done
movl $5, %eax
leave
ret
lo hizo tanto en la división, multiplicación y adición en una sola instrucción! Claramente, no tiene que preocuparse por esto si el optimizador es de algún tipo respetable.
Perdón por la respuesta demasiado larga.
¿Ejecutaste un punto de referencia? Solo se trata de una docena de líneas de código. ¿Qué aprendiste al ejecutar un punto de referencia? [Sugerencia: hacer eso hubiera sido más rápido que publicar la pregunta aquí.] –
El comando timeit en IPython es una línea – endolith
Gran pregunta, que ha generado algunas respuestas/discusiones bastante interesantes. Gracias :) – stealthcopter