[c/c++]Timer linux

di il
5 risposte

[c/c++]Timer linux

Salve.. avevo bisogno di un timer che mi misuri le prestazioni di una parte del programma. Non è obbligatorio che mi restituisca per forza il tempo in ms.. basta che mi dia un valore misura del tempo di esecuzione.

Il sistema operativo è ubuntu e il pc dove lo uso è un core 2 duo T5250 a 1.5 GHz.
Avevo provato questo:
/*
 * A timer in C
 * author: Danny Battison
 * contact: gabehabe@hotmail.com
 */

#include <time.h>
#include <stdio.h>

clock_t BeginTimer()
{
    //timer declaration
    clock_t Begin; //initialize Begin

    Begin = clock() * CLOCKS_PER_SEC/1000; //start the timer

    return Begin;
}
clock_t EndTimer(clock_t begin)
{
    clock_t End;
    End = clock() * CLOCKS_PER_SEC/1000;   //stop the timer
    return End;
}

int main ()
{
    double begin = BeginTimer();
    printf ("Timer set to: %.2f\n", begin); // print the initialised timer (0)

    // process to be timed goes here
    printf ("Enter something to stop the timer: ");
    char input;
    scanf ("%c", &input);

    // variable declarations used for time calculation
    float elapTicks;
    float elapMilli, elapSeconds, elapMinutes;

    // variable definitions on to calculate time taken
    elapTicks = EndTimer(begin);    // stop the timer, and calculete the time taken
    elapMilli = elapTicks/1000;     // milliseconds from Begin to End
    elapSeconds = elapMilli/1000;   // seconds from Begin to End
    elapMinutes = elapSeconds/60;   // minutes from Begin to End

    printf ("Milliseconds passed: %.2f\n", elapMilli);
    printf ("Seconds passed: %.2f\n", elapSeconds);
    printf ("Minutes passed: %.2f", elapMinutes);

    // hold the window open
    char dummy;
    scanf ("%c", &dummy);
    return 0;
}
Ma (mentre ad altri funzionava.. ad esempio con osx, ma anche ad altri con ubuntu), a me da sempre come risultato 0. E' facile vedere dal codice che clock() mi torna sempre 0.
Dopo ore e ore di ricerva, sono arrivato che l'unica causa (non essendoci problemi di compilatori/librerie ecc..) è che l'esecuzione è troppo veloce.. e dunque il tempo risulta 0.

Difatti provando ad inserire, tra il begin e l'end, un semplice:
for(int i=0;i<200000000;i++);
viene fuori il risultato corretto del tempo di esecuzione di solito 6 decimi circa.
Il problema è che nel programma dove dovrei usare ciò, devo misurare un tempo di esecuzione minore di quel tempo! E questa time non va...

5 Risposte

  • Re: [c/c++]Timer linux

    Che coincidenza, stavo facendo la stessa cosa proprio ora per verificare alcune velocità su algoritmi misti.

    Io per farlo uso gettimeofday che utilizza la struttura timeval con all'interno elementi in secondi e milionesimi di secondo.
    Per la differenza sulle devi avere una funzioncina tipo questa:
    
    int timeval_subtract (result, x, y)
              struct timeval *result, *x, *y;
    {
            /* Perform the carry for the later subtraction by updating y. */
            if (x->tv_usec < y->tv_usec)
            {
                    int nsec = (y->tv_usec - x->tv_usec) / 1000000 + 1;
                    y->tv_usec -= 1000000 * nsec;
                    y->tv_sec += nsec;
           }
            if (x->tv_usec - y->tv_usec > 1000000)
            {
                    int nsec = (x->tv_usec - y->tv_usec) / 1000000;
                    y->tv_usec += 1000000 * nsec;
                    y->tv_sec -= nsec;
            }
    
            /* Compute the time remaining to wait.
            tv_usec is certainly positive. */
            result->tv_sec = x->tv_sec - y->tv_sec;
            result->tv_usec = x->tv_usec - y->tv_usec;
    
           /* Return 1 if result is negative. */
            return x->tv_sec < y->tv_sec;
    }
    
    Saluti,
    Max
  • Re: [c/c++]Timer linux

    Cioè in poche parole mi salvo il gettimeofday() prima e dopo il blocco interessato..e questa funzione che intero mi ritornerebbe di preciso?
  • Re: [c/c++]Timer linux

    Ti ritorna la struttura di diffenza tempi che puoi visualizzare come meglio credi.
    Esempio "0,003432 seconds"
    
    #include <time.h>
    ...
    struct timeval tv_start,tv_stop,tv_result;
    ...
    
    gettimeofday(&tv_start,NULL);
    /*
      my code
    /*
    gettimeofday(&tv_stop ,NULL);
    timeval_subtract (&tv_result, &tv_stop, &tv_start);
    
    printf ("%ld,%06ld seconds\n",tv_result.tv_sec, tv_result.tv_usec);
    
    Facile, no?!
  • Re: [c/c++]Timer linux

    Grazie dopo provno
  • Re: [c/c++]Timer linux

    Di niente, figurati...

    Ciao,
    Max
Devi accedere o registrarti per scrivere nel forum
5 risposte