Google
 

miércoles, octubre 04, 2006

C/C++: * vs /     Fight! And the winner is...

Existe una leyenda urbana programaril que dice que multiplicar floats es más rápido que dividirlos. Seguro que en más de una ocasión todos habremos visto cosas como:
float l = 1.0f / length();
x *= l;
y *= l;
z *= l;
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:
div.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
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
Los dos están compilados con gcc programa.c -O2. Pongámoslos a prueba:
# time ./div > /dev/null
real 0m26.532s
user 0m26.061s
sys 0m0.374s

# time ./mult > /dev/null
real 0m1.218s
user 0m1.171s
sys 0m0.030s
Todas 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.

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: