Frage an visual-studio-2010, winapi – Entspricht gettimeday () für Windows

18

Kennt jemand eine äquivalente Funktion der Funktion gettimeofday () in der Windows-Umgebung? Ich vergleiche eine Code-Ausführungszeit unter Linux mit Windows. Ich verwende MS Visual Studio 2010 und es wird immer wieder gesagt, dass der Bezeichner "gettimeofday" undefiniert ist.

Für Hinweise dankbar.

Deine Antwort

3   die antwort
4

Wenn Sie wirklich eine Windows-Implementierung von gettimeofday () wollen,Hier ist einer von PostgreSQL das verwendet Windows-APIs und die richtigen Konvertierungen.

Wenn Sie jedoch Timecode möchten, empfehle ich Ihnen, dies zu prüfenQueryPerformanceCounter () oder vondirekt den TSC aufrufen wenn Sie zum Beispiel nur auf x86 laufen werden.

59

Hier ist eine kostenlose Implementierung:

#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;
}
Sehr gut. Ich habe einen Code, der diese Implementierung enthalten war. Genau das gleiche, aber ich muss diesen Code unter Linux haben und weiß nicht, wie ich das machen soll. Wie würde ich diesen Code implementieren, um ihn unter Linux mit derselben Implementierung unter Verwendung von C ++ oder C zu kompilieren? Danke S4nD3r
@SPlatten Um mit sys / time.h binär kompatibel zu sein: int gettimeofday (struct timeval * tv, struct timezone * tz); int settimeofday (const struct timeval * tv, const struct timezone * tz); Michaelangel007
@SPlatten tz sollte nie etwas anderes als null sein ... nur wenn es verwendet wird, geschieht es im Linux-Kernel und ist als veraltet gekennzeichnet. Swift - Friday Pie
Ich weiß, dass dies alt ist, warum wird tzp übergeben, da es nicht referenziert wird? SPlatten
8

GetLocalTime() für die Zeit in der Zeitzone des Systems,GetSystemTime() für UTC. Verwenden Sie, wenn Sie eine Zeitspanne seit der letzten Epoche wünschenSystemTimeToFileTime() oderGetSystemTimeAsFileTime().

Verwenden Sie für IntervallaufnahmenGetTickCount(). Es gibt Millisekunden seit dem Start zurück.

Verwenden Sie diese Option, um Intervalle mit der bestmöglichen Auflösung (nur durch die Hardware begrenzt) aufzunehmenQueryPerformanceCounter().

Verwandte Fragen