2012-06-05 28 views
17

Có ai biết chức năng tương đương của hàm gettimeofday() trong môi trường Windows không? Tôi đang so sánh một thời gian thực thi mã trong Linux và Windows. Tôi đang sử dụng MS Visual Studio 2010 và nó tiếp tục nói, định danh "gettimeofday" là không xác định.Tương đương gettimeday() cho Windows

Cảm ơn mọi con trỏ.

+2

thể trùng lặp của (http://stackoverflow.com/questions/1676036/what-should- i-use-to-replace-gettimeofday-on-windows) –

Trả lời

8

GetLocalTime() cho thời gian trong múi giờ của hệ thống, GetSystemTime() cho UTC. Nếu bạn muốn thời gian từ giây trở đi, hãy sử dụng SystemTimeToFileTime() hoặc GetSystemTimeAsFileTime().

Để lấy khoảng thời gian, hãy sử dụng GetTickCount(). Nó trả về mili giây kể từ khi khởi động.

Để thực hiện các khoảng thời gian có độ phân giải tốt nhất có thể (chỉ giới hạn bởi phần cứng), hãy sử dụng QueryPerformanceCounter().

54

Đây là một ứng dụng miễn phí: [? Tôi nên sử dụng để thay thế gettimeofday() trên 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

Cảm ơn bạn :) :) :) – Omeriko

+0

Rất tốt. Tôi có một mã được bao gồm việc triển khai này. Chính xác như vậy, nhưng tôi cần phải có mã này làm việc trên Linux và tôi không biết làm thế nào để làm điều đó. Làm thế nào tôi sẽ thực hiện đoạn mã này để biên dịch trong Linux bằng cách sử dụng cùng một triển khai này bằng cách sử dụng C++ hoặc C? Thks – S4nD3r

+0

@ S4nD3r #ifdef _WIN32 ... bao gồm các dòng ở trên ... #else #include #endif ... Xem việc sử dụng của tôi trên dự án Buddhabrot của tôi: https://raw.githubusercontent.com/Michaelangel007/buddhabrot/master /buddhabrot.cpp – Michaelangel007

Các vấn đề liên quan