時刻を取得する - 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ナノ秒です。
続行するには何かキーを押してください . . .