Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    420

    [C] Trovare il tempo di calcolo di una funzione

    Ciao a tutti, vorrei trovare il tempo di calcolo di funzione. Ho provato includendo timer.h e usando:
    start = clock();
    funzione; stop = clock();
    durata = (double) (stop-start)/CLK_TCK;
    Ma mi da sempre 0.00000
    Penso che non riesca a rilevare tempi di calcolo non elevati come quelli che sto cercando di calcolare.
    Qualcuno mi puo dare una mano?
    (sono su Win e non posso usare gettimeofday come in linux)
    the sALIEN

  2. #2
    Utente di HTML.it L'avatar di minoz
    Registrato dal
    Oct 2001
    Messaggi
    219
    In effetti ho anch'io lo stesso problema.. :master:
    Io metto la mia funzione da testare im un ciclo della durata di qualche secondo, così dividendo per il numero di volte ottieni la durata della singola funzione..

  3. #3
    Utente di HTML.it L'avatar di minoz
    Registrato dal
    Oct 2001
    Messaggi
    219
    codice:
        time_t Start;
        time_t Stop;
    
        time( &Start );
    
        ...
        ...
        ...
    
        time( &Stop );
        
        printf("Tempo impiegato %f\n", difftime(Stop, Start));
    Io faccio così...

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    420
    ma, intendi come una sorta di media tra i risultati ottenuti?
    the sALIEN

  5. #5
    Utente di HTML.it L'avatar di minoz
    Registrato dal
    Oct 2001
    Messaggi
    219
    Si

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    420
    ora provo a fare come mi hai suggerito, poi ti faccio sapere
    the sALIEN

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    420
    Mi dice sempre che impiega 0.00000.... ti pasto il codice, ma penso che questo fatto dipenda dalla difficoltà del pc a misurare tempi di calcolo esigui come in questo caso e che quindi sia un problema irrisolvibile



    #include <stdio.h>
    #include <time.h>
    int espr(int a,int n);

    main(){
    int a; /*base*/
    int n; /*esponente*/
    int r; /*elemento sul quale eseguire l'operazione di modulo*/
    int risultato; /*risultato dell'espressione*/
    clock_t start, stop;
    double durata;








    printf("\nInserire a (base):");
    scanf("%d",&a);
    printf("\nInserire n (esponente):");
    scanf("%d",&n);
    printf("\ndammi r (elemento sul quale eseguire l'operazione di modulo):");
    scanf("%d",&r);

    time( &start );




    if(a==r) risultato = 0;
    else risultato = espr(a, n) % r;

    time( &stop );


    printf("\n il risultato dell'espressione: %d elevato %d e': %d ",a,n,risultato);

    printf("\n tempo di calcolo : %f",difftime(stop, start));
    getchar ();
    getchar ();
    fflush (stdin);
    }


    int espr(int a, int n)
    {
    if (n==0) return 1; //caso base:
    return a*espr(a,(n-1)); //passo induttivo:
    }
    the sALIEN

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2001
    Messaggi
    127
    Sul forum trovate la risposta ai vostri problemi... ma sono buono e vi posto il codice

    codice:
    #ifdef _WIN32 
    #include <windows.h> 
    
    static LARGE_INTEGER _tstart, _tend; 
    static LARGE_INTEGER freq; 
    
    void tstart(void){ 
        static int first = 1; 
    
        if(first){ 
            QueryPerformanceFrequency(&freq); 
            first = 0; 
        }
    
        QueryPerformanceCounter(&_tstart); 
    } 
    
    void tend(void){ 
         QueryPerformanceCounter(&_tend); 
    } 
    
    double tval(){ 
      return ((double)_tend.QuadPart - (double)_tstart.QuadPart)/((double)freq.QuadPart); 
    } 
    #else 
    #include <sys/time.h> 
    
    static struct timeval _tstart, _tend; 
    static struct timezone tz; 
    
    void tstart(void){ 
        gettimeofday(&_tstart, &tz); 
    } 
    
    void tend(void){ 
        gettimeofday(&_tend,&tz); 
    } 
    
    double tval(){ 
        typedef signed long s; 
        s t1, t2; 
        t1 = (s)_tstart.tv_sec + (s)_tstart.tv_usec/(1000*1000); 
        t2 = (s)_tend.tv_sec + (s)_tend.tv_usec/(1000*1000); 
        return t2-t1; 
    } 
    #endif
    prima di far partire la porzione di codice da cronometrare chiamate

    tstart();

    quando dovete fermare il tempo chiamate

    tend();

    e subito dopo

    double tempo=tval()

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    420
    Ciao Nov@lis, grazie per aver preso parte alla discussione.. ora funziona!
    Grazie mille, ti posso chiedere se conosci qualche sito (possibilmente in italiano) per approffondire questo argomento. Avrei intenzione di capire quello che ho scritto perchè non mi è mai andato di giù di scrivere cose di cui non so assolutamente nulla

    Avevo letto anch'io da qualche parte di questo gettimeofday ma pensavo che esistesse solo per linux (o almeno, non sapevo che libreria includere in win )..
    the sALIEN

  10. #10
    Utente di HTML.it
    Registrato dal
    May 2001
    Messaggi
    127
    teoricamente questo codice funziona sia su windows che su linux.

    Su Windows si utilizzano le funzioni della libreria windows.h
    codice:
    #ifdef _WIN32 
    #include <windows.h>
    mentre su Linux si usa time.h
    codice:
    #else 
    #include <sys/time.h>

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.