PDA

View Full Version : [c]semplice timer - clock() ritorna sempre 0


Rulez
09-01-2010, 14:35
Ciao a tutti :D
Avevo bisogno per un programmino di fare un semplice bechmark che si basa sul tempo di esecuzione di un pezzo di codice.. il più semplice possibile.

In rete ho trovato questo codice:
/*
* 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() * CLK_TCK; //start the timer

return Begin;
}
clock_t EndTimer(clock_t begin)
{
clock_t End;
End = clock() * CLK_TCK; //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;
}

Lo compilo una prima volta sotto ubuntu9.10 con l'ultima versione di gcc e mi dice che CLK_TCK non è dichiarato. Ok, cerco online la nuova "variabile" e fixo cambiandolo in CLOCK_PER_SEC. Lo ricompilo poi con successo!
Lancio il programma (sempre da riga di comando) ed il risultato è:
Enter something to stop the timer:
Milliseconds passed: 0.00
Seconds passed: 0.00
Minutes passed: 0.00

Il bello arriva quando lo eseguono altri miei amici sulle proprie macchine (di cui uno col mio stesso os) con però un risultato positivo! Cioè funzionava..
Guardando il codice è facile capire che la funzione "clock()" mi ritorna sempre 0 (in quanto anche con un define della costante "moltiplicatore" il risultato è sempre il medesimo :|

Perchè solo a me questo programmino non va?

Ps. il programma è eseguito su un portatile ASUS F3S che ha un multicore intel. Però non penso sia dovuto al processore il problema in quanto anche gli altri miei amici (che hanno testato il programma con successo) hanno pure loro il core 2 duo della intel


:help:

Rulez
11-01-2010, 15:58
up..

doshu
13-01-2010, 22:05
quanto codice per niente...se vuoi sapere quanto ci mette ad eseguire del codice basta che fai cosi:

int inizio=clock();

//codice da eseguire

int fine=clock();

int tempo_trascorso=fine-inizio; //tempo in millisecondi

fero86
14-01-2010, 10:19
si, infatti quelle due funzioni BeginTimer ed EndTimer sono ridicole... :asd:

cionci
15-01-2010, 08:11
si, infatti quelle due funzioni BeginTimer ed EndTimer sono ridicole... :asd:

quanto codice per niente...se vuoi sapere quanto ci mette ad eseguire del codice basta che fai cosi:

int inizio=clock();

//codice da eseguire

int fine=clock();

int tempo_trascorso=fine-inizio; //tempo in millisecondi
Allora sbagliate entrambi, chi vi ha detto che clock() ritorni millisecondi ?
Non c'è assolutamente una convenzione, la convenzione c'è solo nei sistemi POSIX compliant in cui clock() ritorna milionesimi di secondo.
Tra l'altro è anche sbagliato il tipo di dati utilizzato nel codice che ho quotato.
Il modo corretto per usare clock è il seguente (è standard C99 e C89):

clock_t begin, end.
double elapsed_seconds;

begin = clock();

//codice da eseguire

end = clock();

elapsed_seconds = (double)(end - begin) / CLOCKS_PER_SEC; //tempo in secondi

wingman87
15-01-2010, 13:03
Non c'è assolutamente una convenzione, la convenzione c'è solo nei sistemi POSIX compliant in cui clock() ritorna milionesimi di secondo.


All'università sui sistemi Solaris tornava i cicli di clock. Non dovrebbe essere POSIX compliant?

cionci
15-01-2010, 14:22
All'università sui sistemi Solaris tornava i cicli di clock. Non dovrebbe essere POSIX compliant?
Boh, non lo so, comunque da quello che ho trovato in giro sembra che ognuno poi faccia un po' come gli pare.

wingman87
15-01-2010, 14:34
Boh, non lo so, comunque da quello che ho trovato in giro sembra che ognuno poi faccia un po' come gli pare.

Ah ok :D Peccato però, sarebbe meglio seguire uno standard unico

cionci
15-01-2010, 14:50
Ah ok :D Peccato però, sarebbe meglio seguire uno standard unico
Tanto c'è la costante che ti aiuta ;)

wingman87
15-01-2010, 15:06
Ah, quindi nel caso clock torni il tempo in milionesimi di secondo CLOCKS_PER_SEC sarà un milione. Grazie per le delucidazioni