システムの現在の時刻を取得します
デバッグ、ログ出力、およびコードの最適化を行う場合、システム時間を取得する必要があることがよくあります。高いパフォーマンス要件を持つ一部のコード最適化では、時間の精度は依然として比較的高いです。インターネットで高品質のコードが見つからなかったので、自分で調べました。コードは次のとおりです(クロスプラットフォームの要件を満たすことができ、単位はマイクロ秒単位です)。
#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ビット値として表すことができ、2つはそれぞれコードの下位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で表します。