• Viernes 15 de Noviembre de 2024, 09:50

Autor Tema:  optimizando el código  (Leído 1435 veces)

rpg245

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
optimizando el código
« en: Martes 9 de Diciembre de 2008, 16:27 »
0
Bueno pues como leéis en el título del post, después de hacer todo mi programa, ahora voy a tratar de optimizarlo, y voy a ver si me podéis echar una mano.
El caso es que mi código es un bucle que se realiza millones de veces, por lo que reducir el tiempo de computación de cualkier instrucción dentro del bucle conlleva el ahorro de bastante tiempo.
Según he visto, y es curioso, una de las cosas que más tarda en mi código es la generación de un número aleatorio con: random(rand_max);...!!!

Alguien sabe alguna forma de generar un número aleatorio de forma más rápida???!!!!

Otra cosa que quería saber es si me podéis ayudar con esto:

for (i=0;i<5;i++){
           cvSetReal2D(A,i,0,(double) X*X-Y*Y);
           cvSetReal2D(A,i,1,(double) 2*X*Y);
           cvSetReal2D(A,i,2,(double) X);
           cvSetReal2D(A,i,3,(double) Y);
           cvSetReal2D(A,i,4,(double) 1.0);
 }

Esta es la forma que tengo de asignar los valores a una matriz, pero me gustaría saber si lo puedo hacer de una forma directa sin usar un bucle,algo del siguiente estilo...:

cvSetReal2D(A,i,(double) X[0]*X[0]-Y[0]*Y[0],(double) X[1]*X[1]-Y[1]*Y[1],(double) X[2]*X[2]-Y[2]*Y[2],(double) X[3]*X[3]-Y[3]*Y[3],(double) X[4]*X[4]-Y[4]*Y[4]);

así asigno a la columna "i" ese vector, no sé o algo que me sirva, escucho proposiciones...un saludo y muchas gracias por adelantado!!!!!

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: optimizando el código
« Respuesta #1 en: Martes 9 de Diciembre de 2008, 16:35 »
0
No creo que eso se pueda hacer en C, de todas formas, no creo que ello optimice la ejecución y además volvería el código menos legible.

Saludos.

rpg245

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: optimizando el código
« Respuesta #2 en: Martes 9 de Diciembre de 2008, 16:43 »
0
Si puede que fuera menos legible, pero eso m da igual.....como ya os digo itero el código millones de veces...si por cada iteración suponte que en cualkier chorrada consigo reducir un ms....ya estoy recortando un millon de milisegundos, es decir, reduzco el cómputo global en 1000s...unos 16 minutos...!!

Y en cuanto al random?...sabéis algo para hacerlo de otra forma??...
Cada 100000 iteraciones de mi código, la realización de ese random se lleva alrededor del 25% del tiempo...tarda casi lo mismo que lo que tardo en insertar un nodo en un array de listas enorme...lo cuál no me parece normal....bueno un saludo!!

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: optimizando el código
« Respuesta #3 en: Martes 9 de Diciembre de 2008, 16:49 »
0
Como te digo, hacerlo como bucle o asignación directa (que no sé si puede) te va a dar igual porque te lo va a convertir a bucle igualmente.

Cita de: "rpg245"
Y en cuanto al random?...sabéis algo para hacerlo de otra forma??...
Weno, si no pones cómo lo haces... :P

Aparte, yo que tú intentaría evitar las multiplicaciones, que son las que ralentizan. En vez de multiplicar por 2, haz un desplazamiento hacia la izquierda. Así para todas las multiplicaciones de potencias de 2.

De todas formas, en tu código todo el trabajo lo hace cvSetReal2D(), por tanto pierdes un montón de tiempo llamando 5 veces a la misma función cada iteración.

Saludos.

rpg245

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: optimizando el código
« Respuesta #4 en: Martes 9 de Diciembre de 2008, 16:58 »
0
En cuanto al random lo hago pues como creo que se hace normalmente, fuera del bucle inicializo con srand

stime = (unsigned) ltime/2;
srand(stime);

Después dentro del bucle tomo valores aleatorios de la siguiente forma:
val=random(n_edges_points+1); donde n_edges_points es un valor que creo anteriormente, generalmente toma valores entre 10000 y 30000....
no lo puedo simplificar más.....

En cuanto al cvSetReal2D, lo llamo 5 veces si, pero por que ya has visto que cada columna se rellena con una ecuación diferente...y por tanto he de llamarlo con las 5 ecuaciones distintas....

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: optimizando el código
« Respuesta #5 en: Martes 9 de Diciembre de 2008, 17:09 »
0
Cita de: "rpg245"
no lo puedo simplificar más.....
Me parece que no.

Cita de: "rpg245"
En cuanto al cvSetReal2D
Cierto, pero es una función de cálculo de matrices o algo así, ¿cierto? Por tanto es normal que tarde. Yo evitaría tener que llamarla 5 veces, pero si no tienes más remedio, entonces evita las multiplicaciones.