2012-06-05 18 views
17

Czy ktoś zna równoważną funkcję gettimeofday() w środowisku Windows? Porównuję czas wykonywania kodu w systemie Linux vs Windows. Używam MS Visual Studio 2010 i ciągle powtarza, identyfikator "gettimeofday" jest niezdefiniowany.Równoważnik gettimeday() dla Windows

Wdzięczny za wszelkie wskazówki.

+2

możliwe duplikat (http://stackoverflow.com/questions/1676036/what-should- i-use-to-replace-gettimeofday-on-windows) –

Odpowiedz

8

GetLocalTime() za czas w strefie czasowej systemu, GetSystemTime() dla UTC. Jeśli chcesz odmierzyć sekundy, użyj SystemTimeToFileTime() lub GetSystemTimeAsFileTime().

Aby uzyskać interwał, użyj GetTickCount(). Zwraca milisekundy od uruchomienia.

Aby uzyskać interwały o najlepszej możliwej rozdzielczości (ograniczone wyłącznie sprzętowo), należy użyć QueryPerformanceCounter().

54

Oto darmowa implementacja [? Co powinienem użyć do zastąpienia gettimeofday() w systemie Windows]

#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; 
} 
+0

Dziękuję :) :) :) – Omeriko

+0

Bardzo dobrze. Mam kod, który został włączony do tej implementacji. Dokładnie to samo, ale muszę mieć ten kod działający na Linuksie i nie wiem jak to zrobić. Jak zaimplementować ten fragment kodu do kompilacji w Linuksie przy użyciu tej samej implementacji przy użyciu C++ lub C? Thks – S4nD3r

+0

@ S4nD3r #ifdef _WIN32 ... zawiera linie powyżej ... #else #include #endif ... Zobacz moje wykorzystanie w moim projekcie Buddhabrot: https://raw.githubusercontent.com/Michaelangel007/buddhabrot/master /buddhabrot.cpp – Michaelangel007