Véase, por ejemplo, How to realise long-term high-resolution timing on windows using C++? y C++ Timer function to provide time in nano seconds.
He hecho algunas pruebas con Cygwin en Windows XP: en mi máquina, la granularidad de gettimeofday() es de aproximadamente 15 mseg (~ 1/64 seg). Lo cual es bastante grosero. Y también lo es la granularidad de:
* clock_t clock(void) (divisor CLOCKS_PER_SEC)
* clock_t times(struct tms *) (divisor sysconf(_SC_CLK_TCK))
Ambos son divisores 1000 (POSIX puede tener 1.000.000 de primera).
Además, clock_getres (CLOCK_REALTIME, ...) devuelve 15 mseg, por lo que es poco probable que clock_gettime() ayude. Y CLOCK_MONOTONIC y CLOCK_PROCESS_CPUTIME_ID no funcionan.
Otras posibilidades para Windows pueden ser RDTSC; ver el artículo de Wikipedia. Y HPET, que no está disponible con Windows XP.
También tenga en cuenta que en Linux, clock() es la hora del proceso, mientras que en Windows es el tiempo de la pared.
Así algunos ejemplos de código, tanto para el estándar de Unix, y para el código CYGWIN se ejecuta en Windows, lo que da una granularidad de unos 50 microsegundos (en mi máquina). El valor de retorno está en segundos y da la cantidad de segundos transcurridos desde que se llamó por primera vez a la función. (Me di cuenta tardíamente de que se trataba de una respuesta que di sobre 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
¿Qué pasa con QueryPerformanceCounter? – kichik
@kichik Escuché que no funciona bien cuando se usa con una CPU de doble núcleo. No sé si es completamente cierto o no – Quillion
El nuevo tiempo de ejecución (incluido con vs2015, v14.0.xyz) incluye un encabezado que define un tipo de timespec (en realidad tres tipos diferentes: _timespec32, _timespec64 y timespec). Desafortunadamente, no hay una macro adjunta (por ejemplo, _TIMESPEC_DEFINED) para probar la presencia de este tipo (argh). –