Differenza oraria in C ++

Qualcuno sa come calcolare la differenza di tempo in C ++ in millisecondi? Ho usato difftime ma non ha abbastanza precisione per quello che sto cercando di misurare.

Devi usare una delle strutture temporali più specifiche, sia di tipo temporale (risoluzione microsecondo) che timespec (risoluzione nanosecondo), ma puoi farlo manualmente in modo abbastanza semplice:

 #include  int diff_ms(timeval t1, timeval t2) { return (((t1.tv_sec - t2.tv_sec) * 1000000) + (t1.tv_usec - t2.tv_usec))/1000; } 

Questo ovviamente ha alcuni problemi con l’overflow dei numeri interi se la differenza nei tempi è molto grande (o se si hanno valori di 16 bit), ma probabilmente non è un caso comune.

So che questa è una vecchia domanda, ma c’è una risposta aggiornata per C ++ 0x. C’è una nuova intestazione chiamata che contiene le utilità temporali moderne. Esempio di utilizzo:

 #include  #include  #include  int main() { typedef std::chrono::high_resolution_clock Clock; typedef std::chrono::milliseconds milliseconds; Clock::time_point t0 = Clock::now(); std::this_thread::sleep_for(milliseconds(50)); Clock::time_point t1 = Clock::now(); milliseconds ms = std::chrono::duration_cast(t1 - t0); std::cout << ms.count() << "ms\n"; } 50ms 

Ulteriori informazioni possono essere trovate qui:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2661.htm

Ora c'è anche un'implementazione boost di .

se stai usando win32 FILETIME è il più preciso che puoi ottenere: Contiene un valore a 64 bit che rappresenta il numero di intervalli di 100 nanosecondi dal 1 ° gennaio 1601 (UTC).

Quindi se vuoi calcolare la differenza tra due volte in millisecondi fai quanto segue:

 UINT64 getTime() { SYSTEMTIME st; GetSystemTime(&st); FILETIME ft; SystemTimeToFileTime(&st, &ft); // converts to file time format ULARGE_INTEGER ui; ui.LowPart=ft.dwLowDateTime; ui.HighPart=ft.dwHighDateTime; return ui.QuadPart; } int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { //! Start counting time UINT64 start, finish; start=getTime(); //do something... //! Stop counting elapsed time finish = getTime(); //now you can calculate the difference any way that you want //in seconds: _tprintf(_T("Time elapsed executing this code: %.03f seconds."), (((float)(finish-start))/((float)10000))/1000 ); //or in miliseconds _tprintf(_T("Time elapsed executing this code: %I64d seconds."), (finish-start)/10000 ); } 

La funzione orologio ti offre un timer al millisecondo, ma non è il massimo. La sua vera risoluzione dipenderà dal tuo sistema. Puoi provare

 #include  int clo = clock(); //do stuff cout << (clock() - clo) << endl; 

e vedi come sono i tuoi risultati.

Puoi usare gettimeofday per ottenere il numero di microsecondi dall’epoca. Il segmento dei secondi del valore restituito da gettimeofday () è lo stesso di quello restituito da time () e può essere lanciato su un time_t e utilizzato in difftime. Un millisecondo è 1000 microsecondi.

Dopo aver usato difftime, calcola tu stesso la differenza nel campo dei microsecondi.

Puoi ottenere precisione micro e nanosecondo da Boost.Date_Time .

Se stai cercando di fare benchmark, potresti voler vedere alcuni degli altri thread qui su SO che discutono l’argomento.

Inoltre, assicurati di comprendere la differenza tra precisione e precisione.

Penso che dovrai usare qualcosa di specifico della piattaforma. Spero che non sia importante? per esempio. Su Windows, guarda QueryPerformanceCounter() che ti darà qualcosa di molto meglio dei millisecondi.