CLI - プロセスの使用リソースを出力

 
1. プロセスの使用リソースを出力
2. 1秒あたりのページフォルトを出力
3. 出力可能なパフォーマンスカウンタを調べる

1. プロセスの使用リソースを出力

 実行しているプログラムが、とても遅いので、メモリの使用量を調べてみました。

using namespace System::Diagnostics;

	・・・

	System::Diagnostics::Process^ myProc = System::Diagnostics::Process::GetCurrentProcess();

	printf("[%s]    NonpagedSystemMemory[%9d] PagedMemory[%9d] PrivateMemory[%9d] VirtualMemory[%9d] WorkingSet[%9d]\n",
			myProc->NonpagedSystemMemorySize, myProc->PagedMemorySize, myProc->PrivateMemorySize, myProc->VirtualMemorySize, myProc->WorkingSet);

	printf("[%s] 64 NonpagedSystemMemory[%9d] PagedMemory[%9d] PrivateMemory[%9d] VirtualMemory[%9d] WorkingSet[%9d]\n",
			myProc->NonpagedSystemMemorySize64, myProc->PagedMemorySize64, myProc->PrivateMemorySize64, myProc->VirtualMemorySize64, myProc->WorkingSet64);
 printf の箇所は、実際には、プログラム内で使用しているログ出力用の関数を使用しています。  一応、くっきり動くんですが 64 がついているのとついていないものの違いが分からない・・・。  64 つきだと PagedMemoryVirtualMemory が 0 になっちゃうんですよね。  それ以外は同じ値になっているのに・・・。

2. 1秒あたりのページフォルトを出力

 結局、前項のものでは、遅い処理時とそうでもないときの違いがよくわからなかったのです。  タスクマネージャやら Process Explorer やらで見てて、どうも、ページフォルトが他のプログラムに比べて多く発生しているようなので、ページフォルトを出力することにしました。  この記事は「WPF+C# でプロセスモニタを作ってみた」を参考にさせていただきました。

using namespace System::Diagnostics;

	・・・

	System::Diagnostics::Process^ myProc = System::Diagnostics::Process::GetCurrentProcess();
	String^ myName = myProc->ProcessName;
	PerformanceCounter^ pc = gcnew System::Diagnostics::PerformanceCounter("Process", "Page Faults/sec", myName);

	printf("[%s]    Page Faults/sec[%8.1f]\n", pc->NextValue());

3. 出力可能なパフォーマンスカウンタを調べる

 結論からいうと前項でも、調査結果は満足のいくものではなかったのですが・・・。  とりあえず、プロセスのパフォーマンスカウンタで何を出力することがでくるかを調べてみました。

using namespace System::Diagnostics;

	・・・

	System::Diagnostics::Process^ myProc = System::Diagnostics::Process::GetCurrentProcess();
	System::String^ myName = myProc->ProcessName;

	System::Diagnostics::PerformanceCounterCategory^ pcc = gcnew System::Diagnostics::PerformanceCounterCategory("Process");
	array<System::Diagnostics::PerformanceCounter^>^ pcs = pcc->GetCounters(myName);

	for each (System::Diagnostics::PerformanceCounter^ pc in pcs)
	{
		CString str = pc->CounterName;
		printf("[%s]\n", str);
	}
 で、得られたのが下記の表です。全部の項目を埋めるのはいつになることやら。
カウンタ名 意味 備考
% Processor Time
% User Time
% Privileged Time
Virtual Bytes Peak
Virtual Bytes
Page Faults/sec 1秒あたりのページフォルト回数
Working Set Peak
Working Set
Page File Bytes Peak
Page File Bytes
Private Bytes
Thread Count プロセス内のスレッド数
Priority Base
Elapsed Time プロセス実行開始からの経過時間
ID Process プロセスのID
Creating Process ID そのプロセスを作成したプロセスのID
Pool Paged Bytes
Pool Nonpaged Bytes
Handle Count 現在オープンしているハンドルの数
IO Read Operations/sec
IO Write Operations/sec
IO Data Operations/sec
IO Other Operations/sec
IO Read Bytes/sec
IO Write Bytes/sec
IO Data Bytes/sec
IO Other Bytes/sec
Working Set - Private