PDA

View Full Version : [c] migliorare prestazioni del programma


mamo139
16-01-2008, 17:46
ho notato che questa parte di codice appesantisce molto lo script (senza ci mette circa la metà)...
if((x%1048576)==0)
printf("%dMb\n",(x/1048576));

come avvelocizzarlo senza perdere la funzione che segna quanti megabyte sono stati processati??
si puo poi velocizzare anche il resto del programma??

grazie mille:D



#include <stdio.h>

int main (void){

char nomefile[20];
scanf("%s",nomefile);
printf("%s!\n",nomefile);


char *buf;
buf = new char [1];
FILE *f, *f_out;
if ((f = fopen(nomefile, "rb")) && (f_out = fopen("cript.crp", "wb")))
{
size_t b;
long x=0;
while( b= fread( buf, 1, 1, f) ) {
buf[0]=buf[0]+1;//cifratura
x++;
if((x%1048576)==0)
printf("%dMb\n",(x/1048576));
fwrite( buf, 1, b, f_out);

}
pclose(f);
fclose(f_out);

}


return 0;
}

Furla
16-01-2008, 19:39
penso che il problema sia la stampa a video, non la condizione.

mamo139
16-01-2008, 20:15
penso che il problema sia la stampa a video, non la condizione.

ma la stampa a video avviene solo ogni megabyte...
cmq ho aumentato al grandezza del buffer, ora leggo 64.000 byte alla volta e nn piu uno alla volta!! così va mooolto piu veloce, ma voglio sapere se posso migliorarlo ancora... qualche idea???:p

Unrue
17-01-2008, 08:58
ma la stampa a video avviene solo ogni megabyte...
cmq ho aumentato al grandezza del buffer, ora leggo 64.000 byte alla volta e nn piu uno alla volta!! così va mooolto piu veloce, ma voglio sapere se posso migliorarlo ancora... qualche idea???:p

La stampa a video rallenta un casino, costringe il programma a state dietro allo standard output(la console per intenderci). Hai già provato con l'opzione -O2 in fase di compilazione? Oppure , devi togliere l'if dentro il while. Molto semplicemente puoi memorizzare le informazioni che vuoi un un array e stamparle alla fine. A meno che non le vuoi in tempo reale.Quell' if dentro il ciclo è davvero deleterio per le prestazioni.

mamo139
17-01-2008, 10:39
La stampa a video rallenta un casino, costringe il programma a state dietro allo standard output(la console per intenderci). Hai già provato con l'opzione -O2 in fase di compilazione? Oppure , devi togliere l'if dentro il while. Molto semplicemente puoi memorizzare le informazioni che vuoi un un array e stamparle alla fine. A meno che non le vuoi in tempo reale.Quell' if dentro il ciclo è davvero deleterio per le prestazioni.


dunque così come lo posto ora va molto piu veloce!!!:D solo che vorrei un modo piu furbo per contare a che punto dell'operazione è il programma... qualche idea?? :mc:
#include <stdio.h>

int main (void){

char nomefile[20];
scanf("%s",nomefile);
printf("%s!\n",nomefile);


char *buf;
buf = new char [64000];
FILE *f, *f_out;
if ((f = fopen(nomefile, "rb")) && (f_out = fopen("cript.crp", "wb")))
{
size_t b;
long x=0;
while( b= fread( buf, 1, 64000, f) ) {
int y;
for(y=0;y<=64000;y++) buf[y]=buf[y]+1;
x++;
if((x%16)==0)
printf("%dMb\n",(x/16));
fwrite( buf, 1, b, f_out);

}
pclose(f);
fclose(f_out);

}


return 0;
}