- 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 つきだと PagedMemory と VirtualMemory が 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 | | |
|