Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2008
    Messaggi
    20

    [C] - Tempo di elaborazione - come calcolarlo?

    Praticamente ho fatto un programma in C e il nostro prof ci ha chiesto d calcolare quanto tempo ci mette a svolgere dei compiti che abbiamo implementato in C.
    Un mio collega m ha fatto confondere tra struct timeval e gettime infatti non ci ho capito nulla così volevo chiedere a voi qualche istruzione, qualche esempio, per capire come implementare questa parte del programma cioè ... come calcolare il tempo di elaborazione del mio programma ... cioè quanto ci mette a fare quello che deve fare.

    Grazie!!!
    E scusate, oggi mi esprimo male

  2. #2
    Se sei su Linux e non devi implementare questa funzionalità direttamente all'interno del tuo programma, una possibilità è richiamarlo dalla shell tramite il comando time, che cronometrerà il tempo impiegato dal tuo programma, dividendolo in tempo user, kernel e tempo effettivo.
    In alternativa puoi usare semplicemente la syscall gettimeofday:
    codice:
    #include <sys/time.h>
    
    /* ... */
    
    timeval inizio, fine;
    /* Inizia a cronometrare da qui */
    gettimeofday(&inizio, NULL);
    
    /* ...*/
    
    /* Fine della misurazione */
    gettimeofday(&fine, NULL);
    double tempoTrascorso=(fine.tv_sec-inizio.tv_sec)+(fine.tv_usec-inizio.tv_usec)/1000000.0;
    Sotto Windows puoi fare una cosa analoga con la API GetTickCount (per misurazioni sommarie) o con la QueryPerformanceCounter in abbinata alla QueryPerformanceFrequency (per misurazioni ad alta precisione).
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2008
    Messaggi
    20
    Originariamente inviato da MItaly
    Se sei su Linux e non devi implementare questa funzionalità direttamente all'interno del tuo programma, una possibilità è richiamarlo dalla shell tramite il comando time, che cronometrerà il tempo impiegato dal tuo programma, dividendolo in tempo user, kernel e tempo effettivo.
    In alternativa puoi usare semplicemente la syscall gettimeofday:
    codice:
    #include <sys/time.h>
    
    /* ... */
    
    timeval inizio, fine;
    /* Inizia a cronometrare da qui */
    gettimeofday(&inizio, NULL);
    
    /* ...*/
    
    /* Fine della misurazione */
    gettimeofday(&fine, NULL);
    double tempoTrascorso=(fine.tv_sec-inizio.tv_sec)+(fine.tv_usec-inizio.tv_usec)/1000000.0;
    Sotto Windows puoi fare una cosa analoga con la API GetTickCount (per misurazioni sommarie) o con la QueryPerformanceCounter in abbinata alla QueryPerformanceFrequency (per misurazioni ad alta precisione).

    Ho messo

    int res, sec;
    struct timeval t_inizio, t_fine;
    res=gettimeofday(&t_inizio,NULL);

    <parte di codice da monitorare>

    res=gettimeofday(&t_fine,NULL);
    sec=t_fine.tv_sec-t_inizio.tv_sec;
    printf("\nIl tempo di elaborazione è %d sec",sec);

    Va bene ugualmente??

  4. #4
    Va bene se ti basta la risoluzione di un secondo. Se vuoi avere anche le frazioni di secondo (estremamente importanti se l'algoritmo è piuttosto veloce) usa il mio metodo.

    Tra parentesi, con questo metodo si misura il tempo "vero" trascorso tra l'inizio e la fine, e non il tempo di CPU effettivamente consumato dal programma (tra tempo user e kernel), di conseguenza per avere risultati sensati dovrai fare particolare attenzione a non eseguire nient'altro che rubi tempo di CPU al tuo programma durante il benchmark.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2008
    Messaggi
    20
    Originariamente inviato da MItaly
    Va bene se ti basta la risoluzione di un secondo. Se vuoi avere anche le frazioni di secondo (estremamente importanti se l'algoritmo è piuttosto veloce) usa il mio metodo.

    Tra parentesi, con questo metodo si misura il tempo "vero" trascorso tra l'inizio e la fine, e non il tempo di CPU effettivamente consumato dal programma (tra tempo user e kernel), di conseguenza per avere risultati sensati dovrai fare particolare attenzione a non eseguire nient'altro che rubi tempo di CPU al tuo programma durante il benchmark.

    grazie!!!

    Puoi spiegarmi
    double tempoTrascorso=(fine.tv_sec-inizio.tv_sec)+(fine.tv_usec-inizio.tv_usec)/1000000.0;
    quest'espressione?

    cioè tv.sec è per i secondi
    tv.usec è per i microsecondi

    ???
    Perchè double?
    perchè questa somma e quel diviso un milione al fine.tv_usec ecc ecc ?

  6. #6
    Originariamente inviato da ginter87
    grazie!!!

    Puoi spiegarmi
    double tempoTrascorso=(fine.tv_sec-inizio.tv_sec)+(fine.tv_usec-inizio.tv_usec)/1000000.0;
    quest'espressione?

    cioè tv.sec è per i secondi
    tv.usec è per i microsecondi

    ???
    Esatto, la struttura timeval viene riempita dalla funzione gettimeofday con il tempo passato dall'1/1/1970; il valore in questione è diviso in secondi (membro tv_sec) e in microsecondi da aggiungere a questi ultimi per raggiungere il momento corrente.
    Perchè double?
    Perché un intero non può contenere decimali.
    perchè questa somma e quel diviso un milione al fine.tv_usec ecc ecc ?
    Perché, come spiegato, i microsecondi sono da aggiungere ai secondi specificati per ottenere il tempo corrente; d'altra parte, a noi il tempo interessa in secondi, non in microsecondi (otterremmo altrimenti un numero ridicolmente grande), per cui i microsecondi vengono convertiti in secondi e sommati ad essi.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2008
    Messaggi
    20
    Originariamente inviato da MItaly
    Esatto, la struttura timeval viene riempita dalla funzione gettimeofday con il tempo passato dall'1/1/1970; il valore in questione è diviso in secondi (membro tv_sec) e in microsecondi da aggiungere a questi ultimi per raggiungere il momento corrente.

    Perché un intero non può contenere decimali.

    Perché, come spiegato, i microsecondi sono da aggiungere ai secondi specificati per ottenere il tempo corrente; d'altra parte, a noi il tempo interessa in secondi, non in microsecondi (otterremmo altrimenti un numero ridicolmente grande), per cui i microsecondi vengono convertiti in secondi e sommati ad essi.

    GRAZIE!!!!

  8. #8
    Non c'è di che; ciao!
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.