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).

Visual Studio: Find and Replace

Las expresiones regulares integradas en el editor es una de esas características que siempre me preguntaba porque no las incluían en los editores de programación para Windows. Por suerte cuando Microsoft presentó los nuevos Visual Studio 2003 & 2005 las incluyó (aunque estaría mejor dicho las copió). Os presento un ejemplo rápido:
Imaginad que incluís en vuestro programa la función TT que coge un string y lo retorna en el idioma del sistema. Vemos entonces nuestra vieja función SetTextTraducido(CajaDeTexto, "Texto") se ha quedado obsoleta y debéis reemplazarla por la nueva SetText(CajaDeTexto, TT("Texto")). No podéis hacer un reemplazar texto de los de toda la vida pues el control CajaDeTexto va variando. Solución, activáis la opción de Find and Replace del Visual Studio, activáis las expresiones regulares y escribís:
Find what: SetTextTraducido\({.*}, \"{.*}\"\)
Replace with: SetText(\1, TT("\2"))
Lo que poneis entre las llaves { y } se guarda en un grupo que luego en el recuadro de reemplazar podeis cogerla llamando \1, \2, \x... donde x es el orden de aparición del grupo en la cadena de búsqueda.

lunes, octubre 02, 2006

Dibujando (literalmente) en 3d

¿Qué os parecería poder hacer modelos 3d haciendo un simple dibujo 2d? Lanzar cuatro líneas para dibujar un perro y que el programa automáticamente te creara un modelo 3d del boceto.

Pues ahora es posible a SmoothTeddy. Al principio cuesta un poco hacerse con el programa (no se parece a nada que hayas usado antes) pero cuando lo consigues convierte la tarea de crear modelos 3d en juego de niños.

No dejeis de ver el video ni de echarle un vistazo al paper. Simplemente genial.