PdhComputeCounterStatistics カウンタの統計値を計算する

Cの宣言:

PDH_STATUS PdhComputeCounterStatistics(
	IN HCOUNTER hCounter,
	IN DWORD FormatCode,
	IN DWORD FirstCounter,
	IN DWORD CounterNum,
	IN PPDH_RAW_COUNTER Counters,
	IN PPDH_STATISTICS Statistics);

説明:

Countersで指定したカウンタ値の最大値、最小値、平均値を計算し、結果をStatisticsに返す。

Countersで指定するバッファは、キューの形であると仮定される。すなわち、n<CounterNum-1のとき、Counters[n]の「次の」要素はCounters[n+1]である。Counters[COunterNum-1]の「次の」要素はCounters[0]である。

呼び出し元アプリケーションは、定期的にCountersを更新していく。ある時点であるカウンタを更新したら、次に更新するカウンタは、前回更新したカウンタの「次の」カウンタである。FirstCounterに、最後に更新したカウンタの「次の」カウンタ(すなわち、Countersの中で最も古いカウンタ)のインデックスを設定して本関数を呼ぶと、Statisticsには意図した統計情報が返される。

引数の意味は以下の通り。
hCounter (IN) 統計値をどのように計算するかを決定するために必要な、カウンタのハンドル。
FormatCode (IN) 計算結果の返却方法を指定するフラグ。後述の表を参照。
FirstCounter (IN) どのカウンタから調査を始めるかを示すインデックス。
CounterNum (IN) Countersの要素の数。
Counters (IN) 統計情報を計算する元となるカウンタ値の配列。
Statistics (OUT) 得られた統計情報。

FormatCodeに指定可能なフラグは、二種類ある。それぞれの種類のフラグの論理和を指定することができる。まず、以下のフラグのいずれかが指定可能である。
PDH_FMT_DOUBLE 倍精度浮動小数点で結果を返す。
PDH_FMT_LARGE 64bit整数値で結果を返す。
PDH_FMT_LONG 32bit整数値で結果を返す。

次に、以下のフラグのいずれかが指定可能である。
PDH_FMT_1000 計算結果を1000倍したものを返す。
PDH_FMT_NOSCALE 計算結果には変更を加えない。

Cのサンプル:

CPUの使用率を1分間、1秒ごとに計測して、過去30秒間の統計値を計算し、その最大値、最小値、平均値を順次表示していく。
#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 更新)

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