パフォーマンスデータの統計値の取得(C言語)

説明:

CPUの使用率を1分間、1秒ごとに計測して、過去30秒間の統計値を計算し、その最大値、最小値、平均値を順次表示していく。

キーワード:

PdhOpenQuery, PdhAddCounter, PdhCollectQueryData, PdhGetRawCounterValue, PdhComputeCounterStatistics, PdhCloseQuery

サンプルコード:

#define COUNTERS_SIZE 30

/* 過去30秒のCPU使用率の最大値、最小値、平均値を表示する */
void DispPerfStatistics()
{
	HQUERY hQuery;
	HCOUNTER hCounter;

	PDH_RAW_COUNTER Counters[COUNTERS_SIZE];
	PDH_STATISTICS Statistics;
	
	int CurrentCounter;
	int CurrentNum;
	int i;

	/* 新規クエリーを作成 */
	PdhOpenQuery(NULL, 0, &hQuery);

	/* CPU使用率をクエリーに追加 */
	PdhAddCounter(hQuery, "\\Processor(0#0)\\% Processor Time", 0, &hCounter);

	/* 初期カウンタ値を取得 */
	PdhCollectQueryData(hQuery); 
	PdhGetRawCounterValue(hCounter, NULL, &Counters[0]);
	
	CurrentCounter = 1;
	CurrentNum = 2;

	/* 一分間計測を行う */
	for(i=0; i<60; i++) {
		/* 一秒待機 */
		Sleep(1000);

		/* 現在のカウンタ値を取得 */
		PdhCollectQueryData(hQuery); 
		PdhGetRawCounterValue(hCounter, NULL, &Counters[CurrentCounter]);

		/* 次のカウンタの位置を計算 */
		CurrentCounter++;
		if(CurrentCounter >= COUNTERS_SIZE) CurrentCounter = 0;

		/* 統計値の取得 */
		PdhComputeCounterStatistics(
			hCounter,
			PDH_FMT_DOUBLE,
			(CurrentNum < COUNTERS_SIZE) ? 0 : CurrentCounter,
			CurrentNum,
			Counters,
			&Statistics);

		/* 統計値の表示 */
		printf("min: %.02f%%, max:%.02f%%, avg: %.02f%%\n", 
			Statistics.min.doubleValue,
			Statistics.max.doubleValue,
			Statistics.mean.doubleValue);

		if(CurrentNum < COUNTERS_SIZE) CurrentNum++;
	}

	/* 終了 */
	PdhCloseQuery(hQuery);
}


(original text:1999/01/05 更新)

本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。