PDA

View Full Version : [C++] Tempo di esecuzione


Unrue
27-04-2006, 14:29
Vorrei vedere quanto tempo impiega una funzione a fare il suo lavoro. A tal proposito, nel corpo della funzione, come prima istruzione ho messo:

clock_t tempoesecuzione;
tempoesecuzione = clock();

e come ultima:

String a=(String)(tempoesecuzione/CLK_TCK);

Pero' mi viene un numero che non corrisponde ai secnodi trascorsi. Dove è l'errore? Grazie.

andbin
27-04-2006, 15:01
Vorrei vedere quanto tempo impiega una funzione a fare il suo lavoro. A tal proposito, nel corpo della funzione, come prima istruzione ho messo:

clock_t tempoesecuzione;
tempoesecuzione = clock();

e come ultima:

String a=(String)(tempoesecuzione/CLK_TCK);

Pero' mi viene un numero che non corrisponde ai secnodi trascorsi. Dove è l'errore? Grazie.No, al massimo una cosa del genere:
#include <time.h>

....

clock_t t1, t2;
double tempo;

t1 = clock ();

....codice da misurare....

t2 = clock ();

tempo = ((double) (t2 - t1)) / CLOCKS_PER_SEC;Nota, è da testare. ;)

Unrue
27-04-2006, 15:27
No, al massimo una cosa del genere:
#include <time.h>

....

clock_t t1, t2;
double tempo;

t1 = clock ();

....codice da misurare....

t2 = clock ();

tempo = ((double) (t2 - t1)) / CLOCKS_PER_SEC;Nota, è da testare. ;)


Funziona! Pero' non ho capito: clock() mi da' il tempo di inizio della funzione?Nel senso: parte da 0 e poi, quando lo catturo mi da' il tempo trascorso?O mi da' il tempo di sistema? Quindi sbagliavo in quanto mi serviva anche il tempo di fine. Infatti fai la differenza tra i due. Grazie :)

andbin
27-04-2006, 15:43
Pero' non ho capito: clock() mi da' il tempo di inizio della funzione?Nel senso: parte da 0 e poi, quando lo catturo mi da' il tempo trascorso?O mi da' il tempo di sistema?La documentazione su linux non è chiarissima, quindi ho fatto delle prove pratiche. Quando il processo parte, clock vale 0 e si incrementa man mano che il processo consuma il tempo di CPU.

Unrue
27-04-2006, 15:46
La documentazione su linux non è chiarissima, quindi ho fatto delle prove pratiche. Quando il processo parte, clock vale 0 e si incrementa man mano che il processo consuma il tempo di CPU.

Ok , adesso ho capito.Quindi non serve fare due chiamate a clock(), credo. Basta chiamarlo una volta sola e prendere il tempo. Ma va anche bloccato? Nel senso, Non si ferma fino a che non chiudo il programma?

andbin
27-04-2006, 17:57
Ok , adesso ho capito.Quindi non serve fare due chiamate a clock(), credo. Basta chiamarlo una volta sola e prendere il tempo.Non so cosa devi fare di preciso, ma è buona cosa usare sempre 2 valori ed ottenere la differenza.

Ma va anche bloccato? Nel senso, Non si ferma fino a che non chiudo il programma?No, questo clock è un valore che si incrementa continuamente e quindi, tra l'altro, può anche "wrappare", in pratica ripartire da 0.

Qu@ker
27-04-2006, 20:48
jcd@big:~$ man clock | sed -ne '/^N^HNO/,+3p'
NOTES
The C standard allows for arbitrary values at the start of the program;
subtract the value returned from a call to clock() at the start of the
program to get maximum portability.
jcd@big:~$

Unrue
28-04-2006, 20:18
Non so cosa devi fare di preciso, ma è buona cosa usare sempre 2 valori ed ottenere la differenza.

No, questo clock è un valore che si incrementa continuamente e quindi, tra l'altro, può anche "wrappare", in pratica ripartire da 0.

Mi hai detto che, quando chiami clock(),parte da 0. Quindi non capisco perchè serve chiamarlo, due volte. Alla seconda volta non riparte da 0? Mi tornerebbe fare la differenza se clock(), mi dà il tempo di sistema, quindi, richiamandolo una seconda volta e facendo la differenza ho il tempo trascorso.

andbin
29-04-2006, 11:53
Mi hai detto che, quando chiami clock(),parte da 0. Quindi non capisco perchè serve chiamarlo, due volte. Alla seconda volta non riparte da 0? Mi tornerebbe fare la differenza se clock(), mi dà il tempo di sistema, quindi, richiamandolo una seconda volta e facendo la differenza ho il tempo trascorso.Io ho fatto delle prove su un sistema Linux (una Slackware 9.1):
#include <stdio.h>
#include <time.h>

int main()
{
clock_t c;

c = clock ();
printf ("%d\n", c);

return 0;
}In effetti, stampa 0.

Forse però non hai letto bene il post di Qu@ker. Nella pagina di man di clock c'è una nota importante. Una qualunque implementazione di clock non è obbligata a fornire un valore di 0 all'inizio del processo!!!!!! Potrebbe anche non essere così.
Ecco perché, per avere la massima portabilità, è necessario calcolare la differenza tra 2 valori. Solo in questo modo può eliminare eventuali "offset" del valore!

Unrue
29-04-2006, 12:05
Io ho fatto delle prove su un sistema Linux (una Slackware 9.1):
#include <stdio.h>
#include <time.h>

int main()
{
clock_t c;

c = clock ();
printf ("%d\n", c);

return 0;
}In effetti, stampa 0.

Forse però non hai letto bene il post di Qu@ker. Nella pagina di man di clock c'è una nota importante. Una qualunque implementazione di clock non è obbligata a fornire un valore di 0 all'inizio del processo!!!!!! Potrebbe anche non essere così.
Ecco perché, per avere la massima portabilità, è necessario calcolare la differenza tra 2 valori. Solo in questo modo può eliminare eventuali "offset" del valore!


Ok ora ho capito, grazie per i chiarimenti :)