Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it L'avatar di mamo139
    Registrato dal
    May 2005
    residenza
    Londra
    Messaggi
    841

    [c] velocizzare lo script

    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


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

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    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 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di mamo139
    Registrato dal
    May 2005
    residenza
    Londra
    Messaggi
    841
    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
    quanto mi conviene prendere alla volta?? io ho messo 64.000, dici che devo aumentare ancora?? o meglio abbassare un po??

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

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    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
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it L'avatar di mamo139
    Registrato dal
    May 2005
    residenza
    Londra
    Messaggi
    841
    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??

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    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 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it L'avatar di mamo139
    Registrato dal
    May 2005
    residenza
    Londra
    Messaggi
    841
    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


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

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    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++)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it L'avatar di mamo139
    Registrato dal
    May 2005
    residenza
    Londra
    Messaggi
    841
    Originariamente inviato da oregon
    Programma ... non script !
    eheh ce la farò a chiamarlo programma sono abituato al php

    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

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    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 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.