現在のシステム時刻(マイクロ秒)を取得します

システムの現在の時刻を取得します

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

#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で表します。

おすすめ

転載: blog.csdn.net/wyyy2088511/article/details/108733309