時刻を取得する - GetSystemTime, GetLocalTime, GetSystemTimeAsFileTime, GetSystemTimes関数
システム時刻を取得します。
GetSystemTime
システム時刻をSYSTEMTIME構造体変数へ格納します。この時間はUTC(世界協定時)ですがタイムゾーンは考慮されません。
void WINAPI GetSystemTime(
LPSYSTEMTIME lpSystemTime
);
GetLocalTime
GetSystemTimeと同様ですが、タイムゾーンを考慮します。
void WINAPI GetLocalTime(
LPSYSTEMTIME lpSystemTime
);
GetSystemTimeAsFileTime
現在のUTC時をFILETIME構造体へ格納します。FILETIME構造体は西暦1601年1月正午からの100ナノ秒ごとの経過時間をあらわします。詳細は下記。
void WINAPI GetSystemTimeAsFileTime(
LPFILETIME lpSystemTimeAsFileTime
);
GetSystemTimes
システム起動時からのアイドル時間、カーネル実行時間、ユーザー実行時間の合計を取得します。マルチプロセッサ(複数CPU)のシステムの場合はそれら全てのCPUにおける各々の合計時間です。
BOOL WINAPI GetSystemTimes( LPFILETIME lpIdleTime, LPFILETIME lpKernelTime, LPFILETIME lpUserTime );
Example
#include<stdio.h> #include<windows.h> #define MAX_LOOP 100000 #define N 1000 typedef struct { int _i[N]; char _c[N]; double _d[N]; } Data; void func(Data d); void funcP(Data *d); void FileTimeToULargeInteger(ULARGE_INTEGER *ui, const FILETIME *ft1); int main(){ int i; FILETIME ft1, ft2, ft3; ULARGE_INTEGER ui1, ui2, ui3; SYSTEMTIME st; Data d; /* 現在時刻表示:UTC */ GetSystemTime(&st); printf("現在%d年%d月%d日%d時%d分%d秒です\n", st.wYear,st.wMonth,st.wDay, st.wHour,st.wMinute,st.wSecond); /* 現在時刻表示:UTC+時差 */ GetLocalTime(&st); printf("現在%d年%d月%d日%d時%d分%d秒です\n", st.wYear,st.wMonth,st.wDay, st.wHour,st.wMinute,st.wSecond); /* 計算時間を計測:値渡し */ GetSystemTimeAsFileTime(&ft1); for(i = 0; i < MAX_LOOP; i++){ func(d); } GetSystemTimeAsFileTime(&ft2); FileTimeToULargeInteger(&ui1, &ft1); FileTimeToULargeInteger(&ui2, &ft2); printf("値渡し :%I64dナノ秒\n", (ui2.QuadPart - ui1.QuadPart) * 100); /* 計算時間を計測:参照渡し */ GetSystemTimeAsFileTime(&ft1); for(i = 0; i < MAX_LOOP; i++){ funcP(&d); } GetSystemTimeAsFileTime(&ft2); FileTimeToULargeInteger(&ui1, &ft1); FileTimeToULargeInteger(&ui2, &ft2); printf("参照渡し :%I64dナノ秒\n", (ui2.QuadPart - ui1.QuadPart) * 100); /* システム時間を取得 */ GetSystemTimes(&ft1, &ft2, &ft3); FileTimeToULargeInteger(&ui1, &ft1); FileTimeToULargeInteger(&ui2, &ft2); FileTimeToULargeInteger(&ui3, &ft3); printf("今までのシステムアイドル時間の合計は%I64dナノ秒です。\n", ui1.QuadPart * 100); printf("今までのカーネルモード実行時間の合計は%I64dナノ秒です。\n", ui2.QuadPart * 100); printf("今までのユーザーモード実行時間の合計は%I64dナノ秒です。\n", ui3.QuadPart * 100); return 0; } /* FILETIME構造体変数をULARGET_INTEGER共用体へ格納する関数 */ void FileTimeToULargeInteger(ULARGE_INTEGER *ui, const FILETIME *ft1){ ui->HighPart = ft1->dwHighDateTime; ui->LowPart = ft1->dwLowDateTime; } void func(Data d){ int i = 0; for(i = 0; i < N; i++){ d._i[i] = i; } for(i = 0; i < N; i++){ d._c[i] = i; } for(i = 0; i < N; i++){ d._d[i] = (double)0.1 * i; } return ; } void funcP(Data *d){ int i = 0; for(i = 0; i < N; i++){ d->_i[i] = i; } for(i = 0; i < N; i++){ d->_c[i] = i; } for(i = 0; i < N; i++){ d->_d[i] = (double)0.1 * i; } return ; }
Explanation
とりあえず、全部の関数を使ってみました。FILETIME構造体の扱いについてはGetFileTime関数の記事(http://d.hatena.ne.jp/prog_pc/20090521/1242883859)をご覧ください。FILETIME構造体へは100ナノ秒単位で格納されるそうですが、それが正確かどうかは分かりません。しかし、さらに高精度な時間を得るためにMicrosoftはmultimedia timerとHigh-Resolution Timerを用意しているようです。
Result
現在2009年5月22日7時10分57秒です 現在2009年5月22日16時10分57秒です 値渡し :4206048000ナノ秒 参照渡し :3024348800ナノ秒 今までのシステムアイドル時間の合計は3193792448000ナノ秒です。 今までのカーネルモード実行時間の合計は3482086995200ナノ秒です。 今までのユーザーモード実行時間の合計は238492936000ナノ秒です。 続行するには何かキーを押してください . . .