獲取系統當前時間
在調試、日志輸出、代碼優化時,我們常常需要獲得系統的時間。在一些性能要求高的代碼優化時,對時間的精確度還比較高。在網上找不高質量的代碼,便自己研究了一下,代碼如下(能滿足跨平台的要求,單位精確到微秒):
#ifdef _WIN32 #include <windows.h> #else #include <time.h> #endif // _WIND32 // 定義64位整形 #if defined(_WIN32) && !defined(CYGWIN) typedef __int64 int64_t; #else typedef long long int64t; #endif // _WIN32 // 獲取系統的當前時間,單位微秒(us) int64_t GetSysTimeMicros() { #ifdef _WIN32 // 從1601年1月1日0:0:0:000到1970年1月1日0:0:0:000的時間(單位100ns) #define EPOCHFILETIME (116444736000000000UL) FILETIME ft; LARGE_INTEGER li; int64_t tt = 0; GetSystemTimeAsFileTime(&ft); li.LowPart = ft.dwLowDateTime; li.HighPart = ft.dwHighDateTime; // 從1970年1月1日0:0:0:000到現在的微秒數(UTC時間) tt = (li.QuadPart - EPOCHFILETIME) /10; return tt; #else timeval tv; gettimeofday(&tv, 0); return (int64_t)tv.tv_sec * 1000000 + (int64_t)tv.tv_usec; #endif // _WIN32 return 0; }
代碼說明
在類Unix平台(Linux、OS-X)使用gettimeofday方法,這個簡單,沒什么好說,自己看代碼。在Windows平台使用GetSystemTimeAsFileTime方法,這個需解釋一下。
GetSystemTimeAsFileTime的輸出參數是LPFILETIME,其結構如下:
typedef struct _FILETIME { DWORD dwLowDateTime; DWORD dwHighDateTime; } FILETIME, *PFILETIME;
這個結構可表示為一個64位的數值,兩個成為分別代碼低32位和高32位,代表1601年1月1日開始到現在的計數器,計數間隔為100納秒。
而
li.LowPart = ft.dwLowDateTime; li.HighPart = ft.dwHighDateTime;
是將結構體轉換成64位整形LARGE_INTEGER::QuadPart。
#define EPOCHFILETIME (116444736000000000UL)表示從1601年1月1日0:0:0:000到1970年1月1日0:0:0:000的時間(單位100ns)。