在窗口上使用gettimeofday()等价物

我正在使用Visual Studio 2013在Windows上使用2个不同的等价物来获取UNIX的gettimeofday()函数。

我从这里拿第一个。 作为第二个,我正在使用_ftime64_s函数, 这里解释。

他们工作,但不是我所期望的。 我想在打印秒数或至less毫秒时获得不同的值,但是通过gettimeofday()(mytime1&mytime2)和_ftime64_s(mytime3&mytime4)获得相同的打印值。

但值得一提的是,这两个函数的毫秒数值确实是不同的(即mytime1 / mytime2的毫秒值与mytime3 / mytime4不同)。

这是我的代码:

#include <stdio.h> #include <Windows.h> #include <stdint.h> #include <sys/timeb.h> #include <time.h> #define WIN32_LEAN_AND_MEAN 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 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; } int main() { /* working with struct timeval and gettimeofday equivalent */ struct timeval mytime1; struct timeval mytime2; gettimeofday(&(mytime1), NULL); gettimeofday(&(mytime2), NULL); printf("Seconds: %d\n", (int)(mytime1.tv_sec)); printf("Milliseconds: %d\n", (int)(mytime1.tv_usec)); printf("Seconds: %d\n", (int)(mytime2.tv_sec)); printf("Milliseconds: %d\n", (int)(mytime2.tv_usec)); /* working with _ftime64_s */ struct _timeb mytime3; struct _timeb mytime4; _ftime64_s(&mytime3); _ftime64_s(&mytime4); printf("Seconds: %d\n", mytime3.time); printf("Milliseconds: %d\n", mytime3.millitm); printf("Seconds: %d\n", mytime4.time); printf("Milliseconds: %d\n", mytime4.millitm); return (0); } 

我尝试了其他格式说明符(%f,%lu)和castings((float),(double),(long),(size_t)),但这并不重要。 build议将受到欢迎。

QueryPerformanceCounter用于在Windows上进行精确计时。 用法可以如下所示:

 uint64_t microseconds() { LARGE_INTEGER fq, t; QueryPerformanceFrequency(&fq); QueryPerformanceCounter(&t); return (1000000 * t.QuadPart) / fq.QuadPart; } 

据我所知,这不适用于任何EPOCH 。 为此,您需要GetSystemTimePreciseAsFileTime ,它仅在Windows 8和更高版本上可用。

 uint64_t MyGetSystemTimePreciseAsFileTime() { HMODULE lib = LoadLibraryW(L"kernel32.dll"); if (!lib) return 0; FARPROC fp = GetProcAddress(lib, "GetSystemTimePreciseAsFileTime"); ULARGE_INTEGER largeInt; largeInt.QuadPart = 0; if (fp) { T_GetSystemTimePreciseAsFileTime* pfn = (T_GetSystemTimePreciseAsFileTime*)fp; FILETIME fileTime = { 0 }; pfn(&fileTime); largeInt.HighPart = fileTime.dwHighDateTime; largeInt.LowPart = fileTime.dwLowDateTime; } FreeLibrary(lib); return largeInt.QuadPart; } int main() { uint64_t t1 = microseconds(); uint64_t t2 = microseconds(); printf("t1: %llu\n", t1); printf("t2: %llu\n", t2); return (0); }