PDA

Visualizza la versione completa : [c] velocizzare lo script


mamo139
16-01-2008, 18:34
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?? grazie




#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;
}

oregon
16-01-2008, 18:54
Fossi in te non leggerei un carattere alla volta con la fread, ma un blocco di byte abbastanza grande, ponendoli in un buffer in memoria, per elaborarli piu' velocemente.

Vedrai che la velocita' del programma (non script, programma) aumentera' notevolmente ...

mamo139
16-01-2008, 19:09
Originariamente inviato da oregon
Fossi in te non leggerei un carattere alla volta con la fread, ma un blocco di byte abbastanza grande, ponendoli in un buffer in memoria, per elaborarli piu' velocemente.

Vedrai che la velocita' del programma (non script, programma) aumentera' notevolmente ...


oddio, così va molto piu veloce, grazie mille :D
quanto mi conviene prendere alla volta?? io ho messo 64.000, dici che devo aumentare ancora?? o meglio abbassare un po?? :fagiano:



#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%1048576)==0)
printf("%dMb\n",(x/1048576));
fwrite( buf, 1, b, f_out);

}
pclose(f);
fclose(f_out);

}


return 0;
}

oregon
16-01-2008, 19:14
Dipende dal tipo di file che tratti ... se gestisci dei file da 500 M allora puoi usare anche 1 M di buffer ... vedi un po' tu ... al "limite", se il file non e' molto grande, puoi allocare esattamente lo spazio necessario per leggerlo tutto con una sola fread ...

Fai attenzione pero', perche' nel codice che hai mostrato, tratti soltanto blocchi da 64000 byte, mentre devi considerare che l'ultimo blocco letto e' molto probabile che sia di lunghezza minore ... Ovvero, per un file lungo 150000 byte, leggerai 3 blocchi da

64000 byte
64000 byte
22000 byte

mamo139
16-01-2008, 19:18
Originariamente inviato da oregon
Dipende dal tipo di file che tratti ... se gestisci dei file da 500 M allora puoi usare anche 1 M di buffer ... vedi un po' tu ... al "limite", se il file non e' molto grande, puoi allocare esattamente lo spazio necessario per leggerlo tutto con una sola fread ...

Fai attenzione pero', perche' nel codice che hai mostrato, tratti soltanto blocchi da 64000 byte, mentre devi considerare che l'ultimo blocco letto e' molto probabile che sia di lunghezza minore ... Ovvero, per un file lungo 150000 byte, leggerai 3 blocchi da

64000 byte
64000 byte
22000 byte

mhh si ci avevo pensato, solo che poi ho pensato che anche se nell'ultimo ciclo lavoro dei dati in piu comunque fwrite( buf, 1, b, f_out); scrive solo i dati letti...
almeno credo che sia così, sbaglio?? :confused:

oregon
16-01-2008, 19:27
Va bene, perche' alla fwrite passi il valore b, che sono il numero di byte letti dalla fread.

Pero', ad esempio se il buffer fosse da 1 M, mi sembra inutile trattare dei byte inutilmente ...

mamo139
19-01-2008, 11:30
sono approdato a questa nuova versione dello script...
esegue tutte le operazioni correttamente, ma prima di chiudersi da errore e si termina e non riesco a capire il motivo...
ancora grazie :zizi:




#include <stdio.h>

int main (void){

long lbuffer = 60000; //determina sia il buffer di lettura che la lunghezza della chiave
char progkey = 100;
long xmega = 1048576/lbuffer;
printf("buffer impostato a %d bytes\n",lbuffer);

char nomefile[20];
printf("nome del file da crittografare:");
scanf("%s",nomefile);
printf("%s!\n",nomefile);

char nomechiave[20];
printf("nome del file chiave:");
scanf("%s",nomechiave);
printf("%s!\n",nomechiave);

//preparazione della chiave
char *kbuf;
kbuf = new char [lbuffer];

char *chiave;
chiave = new char [lbuffer];
FILE *keyfile;
if ((keyfile = fopen(nomechiave, "rb")))
{
size_t a;
long x=0;
while( a = fread( kbuf, 1, lbuffer, keyfile) ) {
x=x+lbuffer;
/* ciclo di creazione chiave */ int y;
for(y=0;y<=a;y++) chiave[y]=chiave[y]+kbuf[y];

if((x%xmega)==0) //informazioni sullo stato del processo
printf("creazione chiave: %dMb analizzati\n",(x/1048576));

}
fclose(keyfile);
}
printf("\n\nchiave creata!!!!!\n\n");

//inizio processo per la scrittura del nuovo file
char *buf;
buf = new char [lbuffer];
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, lbuffer, f) ) {

x=x+lbuffer;

/* ciclo di cifratura */ int y;
for(y=0;y<=b;y++) buf[y]=buf[y]+chiave[y]+progkey;

if((x%xmega)==0) //informazioni sullo stato del processo
printf("%dMb\n",(x/1048576));

fwrite( buf, 1, b, f_out);

}
fclose(f);
fclose(f_out);

}


return 0;
}

oregon
19-01-2008, 11:33
Originariamente inviato da mamo139
sono approdato a questa nuova versione dello script...

Programma ... non script !



esegue tutte le operazioni correttamente, ma prima di chiudersi da errore e si termina e non riesco a capire il motivo...

Per evitare di provare tutto ... quale errore ti da' e in quale linea ?

EDIT:
in ogni caso, un ciclo come questo

for(y=0;y<=b;y++)

e' sbagliato perche' se hai b elementi e parti da zero, devi arrivare all'elemento b-1 ... quindi

for(y=0;y<b;y++)

mamo139
19-01-2008, 11:45
Originariamente inviato da oregon
Programma ... non script !

eheh ce la farò a chiamarlo programma :D sono abituato al php :zizi:


Originariamente inviato da oregon
Per evitare di provare tutto ... quale errore ti da' e in quale linea ?

EDIT:
in ogni caso, un ciclo come questo

for(y=0;y<=b;y++)

e' sbagliato perche' se hai b elementi e parti da zero, devi arrivare all'elemento b-1 ... quindi

for(y=0;y<b;y++)

il programma si complila... è quando lo eseguo che fa tutte le sue operazioni e poi prima di chiudersi la finestra nera da errore con quella odiosa finestra di windows :dhò:

oregon
19-01-2008, 11:46
L' "odiosa finestra" e' un ottimo avvertimento del fatto che stai hai scritto in zone di memoria non consentite ... e lo fai con quel for sbagliato ...

Loading