システム全体と特定のプロセスの CPU と RAM の使用量を計算する必要があります。私はC#でこれをやったことがありません。そのため、次のコードを思いつくことができました (主にこの Web サイトのサンプルから取得しました)。
try
{
Process proc = Process.GetCurrentProcess();
string strProcName = proc.ProcessName;
Console.WriteLine("Process: " + strProcName);
using (PerformanceCounter total_cpu = new PerformanceCounter("Process", "% Processor Time", "_Total", true))
{
using (PerformanceCounter process_cpu = new PerformanceCounter("Process", "% Processor Time", strProcName, true))
{
for (; ; )
{
Console.CursorTop = 1;
Console.CursorLeft = 0;
float t = total_cpu.NextValue() / Environment.ProcessorCount;
float p = process_cpu.NextValue() / Environment.ProcessorCount;
Console.WriteLine(String.Format("Total CPU (%) = {0}\t\t\nApp CPU (%) = {1}\t\t\nApp RAM (KB) = {2}",
t, p, Process.GetCurrentProcess().WorkingSet64 / (1024)
));
System.Threading.Thread.Sleep(100);
}
}
}
}
catch(Exception ex)
{
Console.WriteLine("Exception: " + ex);
}
しかし、それが私に与えるのは、「マップ全体」のデータです。見てみましょう:
誰かがこれらの点に答えることができます:
このようなパフォーマンス カウンターの実行は、それ自体がかなりコストのかかる操作のようです。CPU 使用率が約 5% 上昇します。私は C++ で大量の CPU カウンターを実行しましたが、実行にほとんど CPU 時間を要しませんでした。
上で言ったことに加えて、上記のループが最初に実行されると、2 秒の遅延が発生します。文字通り2 秒間ハングアップします。それは正常ですか?もしそうなら、私は彼らがそれをパフォーマンスカウンターと呼ぶ大胆さを持っていたとは信じられません:)
私の RAM の読み取り値は、タスク マネージャーによって報告された値にかなり近いですが、CPU の出力は完全にオフになっています。誰かが私がここで間違っていることを教えてもらえますか?
さらに、これらすべてを説明できるPerformanceCounter クラスのドキュメントが見つからないようです:
% Processor Time
、_Total
など? そして最も重要なことは、それらは英語のみですか?それらはローカライズされるべきですか?そこでのプロセスは、その名前で指定されます。しかし、同じ名前で複数のプロセスが実行されている場合はどうでしょう。じゃあ何?