Pytanie w sprawie winapi, visual-studio-2010 – Odpowiednik gettimeday () dla Windows

18

Czy ktoś zna równoważną funkcję funkcji gettimeofday () w środowisku Windows? Porównuję czas wykonania kodu w systemie Linux z systemem Windows. Korzystam z MS Visual Studio 2010 i nadal mówi, identyfikator „gettimeofday” jest niezdefiniowany.

Wdzięczny za wszelkie wskazówki.

Twoja odpowiedź

3   odpowiedź
8

GetLocalTime() na czas w systemowej strefie czasowej,GetSystemTime() dla UTC. Jeśli potrzebujesz czasu, który upłynął od kilku sekund, użyjSystemTimeToFileTime() lubGetSystemTimeAsFileTime().

Do robienia interwałów używajGetTickCount(). Zwraca milisekundy od uruchomienia.

Do interwałów z najlepszą możliwą rozdzielczością (ograniczoną tylko sprzętem), użyjQueryPerformanceCounter().

4

oto jeden z PostgreSQL używa interfejsów API systemu Windows i odpowiednich konwersji.

Jeśli jednak chcesz kodować czas, radzę zajrzeć do niegoQueryPerformanceCounter () lub przezbezpośrednie wywołanie TSC jeśli masz zamiar uruchomić tylko na x86.

59

Oto darmowa implementacja:

#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;
}
To powinna być zaakceptowana odpowiedź! BPL
@ S4nD3r #ifdef _WIN32 ... zawiera linie powyżej ... #else #include <sys / time.h> #endif ... Zobacz moje użycie w moim projekcie Buddhabrot:raw.githubusercontent.com/Michaelangel007/buddhabrot/master/… Michaelangel007
Wiem, że to jest stare, dlaczego przekazuje się tzp, ponieważ nie ma do niego odniesienia? SPlatten
@SPlatten tz nigdy nie powinien być niczym innym niż null ... tylko przypadek, w którym jest używany, dzieje się w jądrze Linuxa i jest oznaczony jako przestarzały. Swift - Friday Pie

Powiązane pytania