Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Vectores de Gran tamaño en C.

Estas en el tema de Vectores de Gran tamaño en C. en el foro de C/C++ en Foros del Web. Estoy trabajando con un programa con vectores de gran tamaño. El programa funciona bien recorro el vector y relleno los datos, mas o menos lo ...
  #1 (permalink)  
Antiguo 14/10/2015, 03:44
 
Fecha de Ingreso: mayo-2015
Mensajes: 5
Antigüedad: 9 años, 6 meses
Puntos: 0
Vectores de Gran tamaño en C.

Estoy trabajando con un programa con vectores de gran tamaño. El programa funciona bien recorro el vector y relleno los datos, mas o menos lo ejecuto en unos segundos, el problema es cuando modifico el programa para meter una condicion para que muestra por pantalla que no es valido entonces el programa tarda 2 minutos mas que antes que tardaba unos segundos.

Codigo 1:
....
if (v[i]==valor) { tiempo de ejecucion 2 minutos
printf("no valido");
scanf("%d",j);
}
exit(0);

sin embargo en lugar del codigo de arriba meto este otro codigo se ejecuta 1 o 2 segundos:

Codigo 2:
....
if (v[i]==valor) { 2 segundos
vale=0;
}
exit(0);

solo cuando meto ese trozo de codigo 1 se ralentiza el programa pero una barbaridad, alguien sabe por que puede ser? el tamaño del vector es int v[531441] y lo compilo con gcc mingw 4.8.0. Espero que alguien me lo aclare.

pos data tambien he usado punteros en lugar de vectores y ocurre lo mismo me esta volviendo loco, no se si es que al hacer una salida por pantalla otra cosa no se....
  #2 (permalink)  
Antiguo 14/10/2015, 03:56
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Vectores de Gran tamaño en C.

Puedes sacar un ejemplo compilable que reproduzca el problema?

Con lo que has puesto es complicado sacar conclusiones

Un saludo
  #3 (permalink)  
Antiguo 14/10/2015, 05:23
 
Fecha de Ingreso: mayo-2015
Mensajes: 5
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: Vectores de Gran tamaño en C.

He sacado un trozo compilable para darte un ejemplo de lo que digo

#include <stdio.h>

typedef int vector[4582970];
typedef bool vectorj1[531442];
int main() {
vector v;
vectorj1 vj1;
int i,j,k,contador,contador1;
bool vale;

for (i=1;i<=4582969;i++) v[i]=(i*100)%4582969;

vale=1;

for (i=0;i<=531441;i++) vj1[i]=0;
contador=1245;
for (i=0;i<=1958;i++) {
contador1=i;
for (k=1;k<=531441;k++) {
contador1=v[contador1];
if (contador1==contador) {
vj1[k]=1;
vale=0;
}
}
}

if (vale==0) {
printf("no vale");
scanf("%d",&i);
}

}

esto tarda unos 15 segundos en ejecutarse ( en el programa entero unos 2 minutos y medio), pero al quitar el trozo de codigo ultimo, tarda 1 segundo por que?:


if (vale==0) {
printf("no vale");
scanf("%d",&i);
}
  #4 (permalink)  
Antiguo 14/10/2015, 06:05
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 9 meses
Puntos: 3
Respuesta: Vectores de Gran tamaño en C.

Ese scanf cambia el valor de i que es la variable que controla el final del primero de los tres bucles y que está cambiándola por algún valor que obtiene del buffer de entrada y si no le indicas nada y lo coge sin más a saber que valor coje. No se exactamente que quieres hacer con ese trozo de codigo que te está dando el problema.
  #5 (permalink)  
Antiguo 14/10/2015, 06:35
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Vectores de Gran tamaño en C.

Cita:
Iniciado por angeljgs Ver Mensaje
esto tarda unos 15 segundos en ejecutarse ( en el programa entero unos 2 minutos y medio), pero al quitar el trozo de codigo ultimo, tarda 1 segundo por que?
Fíjate en que si quitas el fragmento que indicas, dejas de comprobar el valor de vale. Esta variable pasa a usarse únicamente para recibir asignaciones.

La otra variable utilizada en el código es vj1 que casualmente le sucede lo mismo que a vale.

Lo que sucede en este caso es que el compilador hace sus optimizaciones y se carga todo el bucle porque, sencillamente, no hace nada productivo.

Prueba a compilar el programa en modo debug, sin optimizaciones, y verás como la diferencia entre una versión y otra es bastante más reducida.

Un saludo
  #6 (permalink)  
Antiguo 14/10/2015, 06:50
 
Fecha de Ingreso: mayo-2015
Mensajes: 5
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: Vectores de Gran tamaño en C.

Cierto con vj1 sucede lo mismo lo que esta dentro del if , si lo modifico :
#include <stdio.h>

typedef int vector[4582970];
typedef bool vectorj1[531442];
int main() {
vector v;
vectorj1 vj1;
int i,j,k,contador,contador1;
bool vale;

for (i=1;i<=4582969;i++) v[i]=(i*100)%4582969;

vale=1;

for (i=0;i<=531441;i++) vj1[i]=0;
contador=1245;
for (i=0;i<=1958;i++) {
contador1=i;
for (k=1;k<=531441;k++) {
contador1=v[contador1];
if (contador1==contador) {
printf("no vale");
}
}
}


}
tambien sucede lo mismo, si no pongo nada dentro del if va rapidisimo, yo creo que es por el printf .
como es en modo debug?

Última edición por angeljgs; 14/10/2015 a las 06:55
  #7 (permalink)  
Antiguo 14/10/2015, 07:03
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Vectores de Gran tamaño en C.

Cita:
Iniciado por angeljgs Ver Mensaje
como es en modo debug?
A la hora de compilar un programa hay, básicamente, dos formas de generar el ejecutable:

  • modo debug: no se realizan optimizaciones de ningún tipo y se añade información de depuración en el código. Este modo es el idóneo durante la fase de desarrollo ya que permite usar los depuradores de código de forma bastante cómoda
  • modo release: se realizan optimizaciones en velocidad / consumo de memoria. Este modo es el empleado para distribuir los programas a los usuarios. El programa generado en modo release puede ser depurado, pero ya no hay una relación código fuente-binario, lo que complica la búsqueda de errores.
Compilar un programa en un modo u otro se consigue configurando el compilador. Los compiladores admiten bastantes parámetros de configuración, sin embargo esta parte no es estándar, por lo que cada compilador tendrá su propio juego de parámetros... te toca mirar la ayuda de tu compilador en concreto.

Sin embargo, para facilitar un poco la vida, si estás programando con un IDE (code::blocks, qtCreator, Visual Studio, etc...), lo más normal es que tengas una opción en algún lado de la interfaz que te permita elegir el tipo de compilación. El IDE dispone en ese caso de una configuración básica para cada tipo que suele funcionar aceptablemente en la mayoría de las situaciones.

Un saludo.
  #8 (permalink)  
Antiguo 16/10/2015, 06:10
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 14 años, 5 meses
Puntos: 73
Respuesta: Vectores de Gran tamaño en C.

En efecto, la llamada a printf consume mucho tiempo de máquina. Mientras que una asignación o una comparación de valores numéricos se traducen al compilar en una o muy pocas instrucciones de máquina (que necesitarán unos pocos microsegundos para ejecutarse), una función "compleja" como printf se va a traducir en un montón de instrucciones de máquina. De cara al usuario, apenas lo vas a notar si solamente resultan unas pocas llamadas, pero sí que lo notarás si (como te está ocurriendo) resultan muchas llamadas y siendo un bucle con muchas iteraciones, más aún teniendo en cuenta que la llamada la tienes en el bucle más interno de un bucle anidado.

Saludos,

Etiquetas: funcion, int, programa, tamaño, vectores
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:02.