|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Napoli
Messaggi: 999
|
[C-Unix] Calcolo tempo in nanosecondi
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: Codice:
#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);
Codice:
#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)));
__________________
Intel Pentium IV 3,0 GHz, Asus P5SD2-X , 1.0 Gb ddr2, Radeon X550 , Maxtor 160Gb sata, Hitachi 100 gb pata,Piooner Dvr-109 ,Microsoft Windows XP Professional Service Pack 2 Ultima modifica di TuLKaS85 : 10-04-2009 alle 12:56. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Mar 2009
Città: Bologna
Messaggi: 1174
|
In Unix puoi usare la funzione POSIX clock_gettime() con CLOCK_REALTIME come primo paramentro
http://linux.die.net/man/3/clock_gettime Codice:
#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);
In Windows puoi dare un'occhiata a QueryPerformanceCounter e QueryPerformanceFrequency http://msdn.microsoft.com/en-us/libr...04(VS.85).aspx Dovrebbe funzionare piu' o meno cosi'... Codice:
#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;
Controllale... ho scritto di getto, senza verificarle... e potrei aver scritto delle cavolate Ultima modifica di BrutPitt : 10-04-2009 alle 13:46. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Napoli
Messaggi: 999
|
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...
__________________
Intel Pentium IV 3,0 GHz, Asus P5SD2-X , 1.0 Gb ddr2, Radeon X550 , Maxtor 160Gb sata, Hitachi 100 gb pata,Piooner Dvr-109 ,Microsoft Windows XP Professional Service Pack 2 |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Mar 2009
Città: Bologna
Messaggi: 1174
|
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. Ultima modifica di BrutPitt : 11-04-2009 alle 08:12. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 02:10.



















