Pregunta sobre visual-studio-2010, winapi – Equivalente de gettimeday () para Windows

18

¿Alguien sabe una función equivalente de la función gettimeofday () en el entorno de Windows? Estoy comparando un tiempo de ejecución de código en Linux vs Windows. Estoy utilizando MS Visual Studio 2010 y sigue diciendo que el identificador "gettimeofday" no está definido.

Agradecido por cualquier punteros.

Tu respuesta

3   la respuesta
4

Aquí hay uno de PostgreSQL. que utiliza las API de Windows y las conversiones adecuadas.

Sin embargo, si quieres un código de tiempo, te sugiero que miresQueryPerformanceCounter () o porInvocando directamente el TSC Si solo vas a correr en x86 por ejemplo.

8

GetLocalTime() por el tiempo en la zona horaria del sistema,GetSystemTime() para la UTC. Si quieres un segundo desde la época, usaSystemTimeToFileTime() oGetSystemTimeAsFileTime().

Para la toma de intervalos, useGetTickCount(). Devuelve milisegundos desde el inicio.

Para tomar intervalos con la mejor resolución posible (limitada solo por hardware), useQueryPerformanceCounter().

59

Aquí hay una implementación gratuita:

#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <stdint.h> // portable: uint64_t   MSVC: __int64 

// MSVC defines this in winsock2.h!?
typedef struct timeval {
    long tv_sec;
    long tv_usec;
} timeval;

int gettimeofday(struct timeval * tp, struct timezone * tzp)
{
    // Note: some broken versions only have 8 trailing zero's, the correct epoch has 9 trailing zero's
    // This magic number is the number of 100 nanosecond intervals since January 1, 1601 (UTC)
    // until 00:00:00 January 1, 1970 
    static const uint64_t EPOCH = ((uint64_t) 116444736000000000ULL);

    SYSTEMTIME  system_time;
    FILETIME    file_time;
    uint64_t    time;

    GetSystemTime( &system_time );
    SystemTimeToFileTime( &system_time, &file_time );
    time =  ((uint64_t)file_time.dwLowDateTime )      ;
    time += ((uint64_t)file_time.dwHighDateTime) << 32;

    tp->tv_sec  = (long) ((time - EPOCH) / 10000000L);
    tp->tv_usec = (long) (system_time.wMilliseconds * 1000);
    return 0;
}
@SPlatten Para ser compatible binario con sys / time.h: int gettimeofday (struct timeval * tv, struct timezone * tz); int settimeofday (const struct timeval * tv, const struct timezone * tz); Michaelangel007
@SPlatten tz nunca debería ser nada más que nulo ... solo en caso de que se use, sucede en el kernel de Linux y está marcado como obsoleto. Swift - Friday Pie
¡Esta debería ser la respuesta aceptada! BPL
Sé que esto es antiguo, ¿por qué se transmite tzp, ya que no se hace referencia? SPlatten

Preguntas relacionadas