Re: Benchmarking en distintos lenguajes [ Era algo así como cliente en jabber... ]
Rodrigo Javier Tobar Carrizo
rtobar en alumnos.inf.utfsm.cl
Lun Nov 19 01:02:15 CLST 2007
Rodrigo Fuentealba wrote:
>>
>> Es decir:
>>
>> for(i=0; i<N; i++) a[i] = b[i] + c[i];
>>
>> es muchisimo mas rapido que
>>
>> for(i=0; i<N; i++) a[i] = sum(b[i], c[i]);
>
> Depende.
>
> Si en C haces algo así:
>
> #include <stdio.h>
> #define SUM(A,B) A + B
>
> int main(void)
> {
> int x = 5, y = 10, z;
>
> z = SUM(x,y);
> printf("%i\n", z);
> return 0;
> }
>
> El preprocesador de C reemplaza la operatoria en tiempo de
> compilación, y permite hacer cosas como esa sin pérdida de ciclos en
> tiempo de ejecución.
>
No es tan asi... la cosa se hace en dos pasos separados (que uno puede
hacer manualmente):
1) Primero se precompila el codigo C para reemplazar todas las macros
del preprocesador, insertar archivos .h, definir nuevos numeros de
linea, remover comentarios, etc...
2) Esto produce un codigo C fresco, limpio y listo para ser compilado
directamente. Es ahora cuando se compila realmente el codigo para
convertirlo en codigo maquina.
En el primer caso (el del for sumando arreglos) hay realmente una
llamada codigo de otra funcion, lo que realmente retarda la ejecucion
del programa. En el segundo caso, cuando usan la macro definida con
directivas del preprocesador, lo que realmente esta pasando es que la
macro se reemplaza ANTES de ser compilada, por lo que si la usamos mil
veces, el codigo va a estar replicado en esas mil partes.
Pueden probar. Haganse un .c con el ejemplo de arriba, pero llamando a
la macro hartas veces. Luego,
rtobar en micasa $> cpp lala.c > salidaPreprocesador.c
y miren salidaPreprocesador.c
Si, desde el punto de vista del programador es lo mismo (estoy llamando
una funcion). Pero una esta definida en el codigo C, y otra es
reemplazada antes de la compilacion.
Saludos!
--
Rodrigo Tobar Carrizo Linux User #399271
CSAT project Leader +5696125127
http://www.alumnos.inf.utfsm.cl/~rtobar
Más información sobre la lista de distribución Linux