7

プログラムが使用しているメモリと CPU の量を調べる方法を尋ねられ、パフォーマンス カウンターを紹介されました。しかし、ドキュメンテーションを見ると、アプリケーションのマニフェストを作成して消費者データを提供することについての説明から始まり、目がくらみます。このような汎用ツールがあるのはいいことだと思いますが、私が欲しかったのは、プログラムが使用しているメモリと CPU の量を教えてくれる一連の関数だけでした。

パフォーマンス カウンターは私の仕事に適したツールですか? もしそうなら、私はそれらをどのように使用しますか?C# アプリケーションの外部で何かをセットアップする必要はありません。

注: サードパーティのプロファイリング アプリを探しているわけではありません。アプリでメモリと CPU のデータを表示する必要があります。

更新: 問題を混乱させているように見えたので、関数の時間を削除しました。

4

5 に答える 5

3

CPU 使用率とメモリ (プロセス ワーキング セット) の単一インスタンス アプリケーションを想定すると、次のようなことができます。

public static void Main(string[] args)
{
    string processName = Process.GetCurrentProcess().ProcessName;
    int processorCount = Environment.ProcessorCount;

    // Simulate process usage
    for (int i = 0; i < processorCount * 2; i++)
    {
        var t = new Thread(() =>
            {
                while (true) { Console.WriteLine("Busy..."); }
            });

        t.IsBackground = true;
        t.Start();
    }

    var cpu = new PerformanceCounter("Process", "% Processor Time");
    cpu.InstanceName = processName;
    cpu.NextValue();

    var ram = new PerformanceCounter("Process", "Working Set");
    ram.InstanceName = processName;

    float memUsage = (ram.NextValue() / 1024) / 1024;
    Console.WriteLine("Memory Usage: {0}MB", memUsage);

    float cpuUsage = cpu.NextValue() / (float)processorCount;
    Console.WriteLine("CPU Usage: {0}%", cpuUsage);
}

CPU 使用率 perf カウンターの場合、最初の呼び出しNextValueは 0 を返すため、2 番目の呼び出しのみを使用して値を表示します。報告される使用量はすべてのマシン プロセッサの合計であるため、表示前に平均が計算されます。

于 2010-03-09T16:38:09.500 に答える
3

すぐに使用perfmonして、CPU、メモリ、ディスクの使用状況、および多くの .NET 固有のパフォーマンス カウンターを監視できます。perfmon には Windows が付属しています。

eye-glazer は、独自の perfmon を作成する場合、または独自のパフォーマンス カウンターを提供する場合にのみ必要です。後者は、ユーザーがこの値を監視する必要がある場合にのみ興味深いものです (たとえば、サーバー アプリケーションを開発していて、無効な月の満ち欠けによって拒否される接続が 10% を超えないようにする必要がある場合など)。

特定の機能に費やす時間を特定するには、プロファイラーを使用します。


パフォーマンス カウンター API を使用すると、既存のパフォーマンス カウンターと一緒にデータを監視できます (たとえば、Foo他のプロセスがディスクをスラッシングしているため、毎晩 11 時以降は関数が非常に遅くなることがわかります)、モニターをサービスとして実行し、後で分析するためにログ ファイルを生成します。

これらの利点がパフォーマンス カウンターの追加の問題に見合う価値があるかどうか、またはログ システムを使用したほうがよいかどうかを判断する必要があります。

あなたにとってそれをより簡単にするかもしれないかなりのサンプルがあります。ただし、アーキテクチャと「公式」の用語を理解することには価値があります。通常、MS APIは多くの読み取りを必要とし、適切なラッパー コードを探す必要がありますが、それが必ずしも苦痛であるとは限りません。

于 2010-03-09T14:51:54.593 に答える
2

簡単な情報として、C# コード内からこれらの値を見て、最も関連性の高いものを選択してください。

System.Diagnostics.Process.GetCurrentProcess().TotalProcessorTime
System.Diagnostics.Process.GetCurrentProcess().PrivateMemorySize64
System.Diagnostics.Process.GetCurrentProcess().VirtualMemorySize64
System.GC.GetTotalMemory(false)

PrivateMemorySize は、プロセスの合計 Private Bytes (マネージドおよびアンマネージドを組み合わせたもの) です。GetTotalMemory は、アプリのマネージド メモリの合計使用量を示します。true を渡すと、値を取得する前に GC が強制されます。

于 2010-03-09T16:44:52.260 に答える
1

パフォーマンス カウンターは、アプリケーションが関数で費やした時間を示しません。そのために、関数の最初で開始し、最後で停止するある種のタイマークラスを使用できます。

于 2010-03-09T14:49:26.883 に答える