PDA

View Full Version : [C-Unix] Calcolo tempo in nanosecondi


TuLKaS85
10-04-2009, 11:52
ho un problema, devo testare il tempo di esecuzione di una funzione in C, utilizzo code::blocks sotto windows e come compilatore usao gcc.

utilizzando questi metodi ottengo sempre ke la differenza tra lo start() e lo stop() è nulla, quindi c'è bisogno di una routine che calcoli il tempo in unità di misura più piccole...

ecco il primo metodo precisione millisecondi:



#include <sys\timeb.h>
-------
struct timeb t_start, t_current;
int t_diff;

ftime(&t_start);
// FUNZIONE DA TESTARE
ftime(&t_current);
t_diff = (int) (1000.0 * (t_current.time - t_start.time)+ (t_current.millitm - t_start.millitm));
printf("Time: %d\n",t_diff);

il secondo precisione (forse) secondi:


#include <time.h>
-------
clock_t seconds,seconds2;
seconds = clock();
//FUNZIONE DA TESTARE
seconds2 = clock();
printf("Time: %.3f \n",((double)(seconds2-seconds)/( (double)CLOCKS_PER_SEC)));



con entrambi i metodi ottengo sempre 0 come risultato....

BrutPitt
10-04-2009, 12:29
In Unix puoi usare la funzione POSIX clock_gettime() con CLOCK_REALTIME come primo paramentro

http://linux.die.net/man/3/clock_gettime



#include <time.h>

timespec start, end;

clock_gettime( CLOCK_REALTIME, &start );


//FUNZIONE DA TESTARE

clock_gettime( CLOCK_REALTIME, &end );

float tempoTrascorso = (end.tv_sec - start.tv_sec) + (1e-9)*(end.tv_nsec - start.tv_nsec);

(Devi linkare la libreria librt.a)



In Windows puoi dare un'occhiata a QueryPerformanceCounter e QueryPerformanceFrequency

http://msdn.microsoft.com/en-us/library/ms644904(VS.85).aspx


Dovrebbe funzionare piu' o meno cosi'...

#include <windows.h>

LARGE_INTEGER start;

LARGE_INTEGER freq, end;

QueryPerformanceCounter( &start );

//FUNZIONE DA TESTARE

QueryPerformanceCounter( &end );
QueryPerformanceFrequency( &freq );
float tempoTrascorso = (end.QuadPart - start.QuadPart)/(float)freq.QuadPart;


P.S.
Controllale... ho scritto di getto, senza verificarle... e potrei aver scritto delle cavolate :)

TuLKaS85
10-04-2009, 22:11
grazie ho seguito il primo consiglio...
solo che mi dava errore sulla dichiarazione di timespec, nonostante abbia linkato -lrt e librt.a ... (per linkare una libreria come questa si aggiunge -librt.a e basta giusto ?)

ho provato a dichiarare io la struttura timespec ed ha funzionato, da solo un warning sulla chiamata di clock_gettime , dice che il secondo parametro non corrisponde... però i tempi li riesco a vedere lo stesso...

BrutPitt
11-04-2009, 07:07
Si basta solo -lrt... ma il problema allora non e' la libreria librt.a, visto che la clock_gettime() viene inclusa nel linking, ma la dichiarazione della struttura.

La struttura dovrebbe essere (anzi e') in <time.h> e se non la prende in automatico basta aggiungere alla linea di comando del compilatore, l'opzione:

-D __need_timespec

In alternativa potresti anche utilizzare una dichiarazione interna, un po' meno elegante della precedente, del tipo:

#define __need_timespec
#include <time.h>

In cui il #define __need_timespec percede l'include in questione.