veda, ad esempio, How to realise long-term high-resolution timing on windows using C++? e C++ Timer function to provide time in nano seconds.
Ho eseguito alcuni test con Cygwin su Windows XP: sulla mia macchina, la granularità di gettimeofday() è di circa 15 msecs (~ 1/64 sec). Che è piuttosto grossolano. E così è la granularità di:
* clock_t clock(void) (divisor CLOCKS_PER_SEC)
* clock_t times(struct tms *) (divisor sysconf(_SC_CLK_TCK))
Entrambi i divisori sono 1000 (POSIX può avere per la prima 1000000).
Inoltre, clock_getres (CLOCK_REALTIME, ...) restituisce 15 msecs, quindi è improbabile che clock_gettime() aiuti. E CLOCK_MONOTONIC e CLOCK_PROCESS_CPUTIME_ID non funzionano.
Altre possibilità per Windows potrebbero essere RDTSC; guarda l'articolo di Wikipedia. E HPET, che non è disponibile con Windows XP.
Nota anche in Linux, clock() è il tempo di elaborazione, mentre in Windows è l'ora del muro.
Così alcuni esempi di codice, sia per lo standard Unix, e per il codice CYGWIN che funziona sotto Windows, che dà una granularità di circa 50 microsecondi (su mia macchina). Il valore restituito è espresso in secondi e indica il numero di secondi trascorsi da quando la funzione è stata chiamata per la prima volta. (Mi sono tardato a capire che era in una risposta che ho dato oltre a year ago).
#ifndef __CYGWIN32__
double RealElapsedTime(void) { // returns 0 seconds first time called
static struct timeval t0;
struct timeval tv;
gettimeofday(&tv, 0);
if (!t0.tv_sec)
t0 = tv;
return tv.tv_sec - t0.tv_sec + (tv.tv_usec - t0.tv_usec)/1000000.;
}
#else
#include <windows.h>
double RealElapsedTime(void) { // granularity about 50 microsecs on my machine
static LARGE_INTEGER freq, start;
LARGE_INTEGER count;
if (!QueryPerformanceCounter(&count))
FatalError("QueryPerformanceCounter");
if (!freq.QuadPart) { // one time initialization
if (!QueryPerformanceFrequency(&freq))
FatalError("QueryPerformanceFrequency");
start = count;
}
return (double)(count.QuadPart - start.QuadPart)/freq.QuadPart;
}
#endif
fonte
2011-12-20 23:39:11
Cosa c'è di sbagliato in QueryPerformanceCounter? – kichik
@kichik Ho sentito che agisce in modo incerto se usato con una CPU dual core. Non so se è completamente vero o no – Quillion
Il runtime nuovo (in bundle con vs2015, v14.0.xyz) include un'intestazione che definisce un tipo di timespec (in realtà tre tipi diversi: _timespec32, _timespec64 e timespec). Sfortunatamente, non esiste una macro di accompagnamento (es. _TIMESPEC_DEFINED) per verificare la presenza di questo tipo (argh). –