float l = 1.0f / length();He querido ponerlo a prueba pues siempre he pensado que aunque fuese cierto el compilador se encargaría siempre de optimizar o que la diferencía sería realmente mínima. Así que preparé dos programas:
x *= l;
y *= l;
z *= l;
div.cLos dos están compilados con gcc programa.c -O2. Pongámoslos a prueba:mult.c
1 #include <stdio.h>
2
3 int main() {
4 int i;
5 for(i = 0; i < 1000000; i++) {
6 float i = 123.4f;
7 float j = 12.3f;
8 float k = i / k;
9 printf("%f\t", k);
10 }
11
12 return 0;
13 }
14
1 #include <stdio.h>
2
3 int main() {
4 int i;
5 for(i = 0; i < 1000000; i++) {
6 float i = 123.4f;
7 float j = 12.3f;
8 float k = i * k;
9 printf("%f\t", k);
10 }
11
12 return 0;
13 }
14
# time ./div > /dev/nullTodas mis ilusiones puestas en que era realmente una leyenda urbana y vaya si que hay diferencía. Multiplicar es unas 20 veces más rápido que dividir.
real 0m26.532s
user 0m26.061s
sys 0m0.374s
# time ./mult > /dev/null
real 0m1.218s
user 0m1.171s
sys 0m0.030s
Making off:
El printf en realidad es un poco chorra pero -O2 hace demasiado bien su trabajo y se da cuenta de que el bucle en realidad no sirve para nada más que para perder tiempo asi que lo elimina. De ahi a incluir el printf y redirigirlo luego a ninguna parte (/dev/null).
No hay comentarios:
Publicar un comentario