Pages : 1
#1 Le 13/07/2014, à 14:44
- cjobic
Ralentissement d'un programme
Bonjour à tous.
Développant un programme me permettant de calculer la FFT d'une image pour l'enregistrer dans un fichier, je me suis aperçu d'une chose surprenante.
Lorsque je lance le programme en ne calculant que la FFT, celui-ci s'execute en moins d'une seconde.
En revanche, si je demande au programme d'utiliser le tableau ainsi créé, ou d'écrire directement le résultat de ces calculs dans un fichier, le programme devient extraordinairement lent.
Avez-vous déjà été confronté à un problème similaire ?
Bonne journée !
Voici mon code :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <tgmath.h>
#define pixelx 600
#define pixely 600
int main(void){
float tab[pixelx][pixely];
float tf_tab[pixelx][pixely];
float sum;
int i,j,i1,j1;
// On lit l'image d'origine
FILE* image=fopen("image.txt","r");
for(i=0;i<pixely;i++){
for(j=0;j<pixelx;j++){
fscanf(image,"%f",&tab[j][i]);
}while(fgetc(image)!='\n');
}while(fgetc(image)!=EOF);
fclose(image);
//On calcule la FFT de l'image
float prefM=2*3.14159/((float)pixelx);
float prefN=2*3.14159/((float)pixely);
float diff,cos_value,tab_value;
for(i1=0;i1<pixelx;i1++){
printf("%d\n",i1);
for(j1=0;j1<pixely;j1++){
sum=0;
//printf("test %d\n",j1);
for(i=0;i<pixelx;i++){
for(j=0;j<pixely;j++){
diff=prefM*(float)i*(float)i1-prefN*(float)j*(float)j1;
cos_value=cos(diff);
tab_value=tab[i][j];
sum=sum+cos_value*tab_value;
}
}
tf_tab[i1][j1]=sum;
}
}
//On enregistre la FFT créée
FILE* resultat=fopen("fft.txt","w");
for(i1=0;i1<pixelx;i1++){
for(j1=0;j1<pixely;j1++){
fprintf(resultat,"%g\t",tf_tab[i1][j1]);
}
fprintf(resultat,"\n");
}
fclose(resultat);
exit(EXIT_SUCCESS);
}
Hors ligne
#2 Le 13/07/2014, à 14:58
- louis94
Re : Ralentissement d'un programme
Bonjour,
Dans quelle partie du code ton programme est-il lent ? Utilise des printf() pour savoir où il en est. Si ton image est grande, il est possible que l'enregistrement prenne du temps. La précision des flottants peut entraîner l'écriture d'un fichier nettement plus grand que celui lu initialement.
Ce n'est pas vraiment une solution, mais peut-être que le compilateur peut optimiser ton programme : essaye de compiler avec
gcc -O4
Louis
Hors ligne
#3 Le 13/07/2014, à 15:05
- cjobic
Re : Ralentissement d'un programme
Merci Louis pour la réponse. Enfait, lorsque je calcule le tableau tf_tab sans utiliser dans la suite du programme ses valeurs, le programme tourne correctement. En revanche, si par la suite, j'utilise ce tableau ou l'une de ses valeurs, avec fprintf par exemple pour l'enregistrer dans un fichier, c'est l'intégralité du programme qui est lent. Rien que le calcul du tableau prend dans ces conditions plus de 10 min. Et je ne comprend pas pourquoi le fait d'utiliser le tableau une fois que celui-ci est calculé, à un impact sur le temps nécessaire pour calculer au préalable ce même tableau.
Après avoir testé ta solution, celle-ci n'a malheureusement aucun effet.
Hors ligne
#4 Le 13/07/2014, à 15:09
- louis94
Re : Ralentissement d'un programme
Une possibilité est que GCC détecte quand le tableau n'est pas utilisé. Et se dit qu'il est totalement idiot de le calculer pour rien.
Louis
Hors ligne
#5 Le 13/07/2014, à 15:25
- cjobic
Re : Ralentissement d'un programme
D'accord. Je vais donc être condamné à patienter le temps qu'il faut pour que le programme se termine
Hors ligne
#6 Le 13/07/2014, à 19:41
- telliam
Re : Ralentissement d'un programme
Salut,
Ton tableau prend bcp de place en pile, tu devrais le déclarer en static. L'écriture dans un fichier est couteuse, d'autant plus que tu écris valeur après valeur. Il vaudrait mieux ecrire par blocs de valeurs ou utiliser une autre fonction d'ecriture.
"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard
Hors ligne
Pages : 1