4

別のプログラムのいくつかのインスタンスを開く小さな winforms アプリケーションを作成しています。パフォーマンスを最適化するために、プロセスを割り当てる最も使用されていない CPU コアを見つける方法を探しています。

また、各コアの使用率を確認できるようにしたいと考えています。TextBox または Label で問題ありません。

PerformanceCounterこれらの答えに出くわした後、私は使用しようとしています:

コア番号の検索

2 コアを超える CPU 使用率

これらを次のように実装してみました。

        StatusBarOutput.Text = "";
        //ignoring posible hyper-threading for simplicity's sake
        var coreUsages = new PerformanceCounter[Environment.ProcessorCount];

        for (var i = 0; i < coreUsages.Length; i++)
        {
            coreUsages[i] = new PerformanceCounter("Processor", "% Processor Time", i.ToString());

            //using the status bar as output for now, doesn't really matter
            StatusBarOutput.Text += "   |   " + coreUsages[i].CounterName + " ~ " + coreUsages[i].NextValue();
        }

私が得ている出力は次のとおりです。

出力

その間、タスクマネージャーはこれを示しています:

出力

ここで何が欠けているのかわかりません。

4

3 に答える 3

7

OS は、使用するコアを決定するのにはるかに優れている可能性があります。MS の人々は、この特定の側面を最適化するために多くの時間を費やしてきました。

それを引き継ごうとすると、新しいサービス パック、OS のバージョン、ハードウェア フレーバーなどごとにこれを維持するつもりですか?

最善の策は、OS を推測しようとするのではなく、プロセスの最適化に時間を費やすことです。

アップデート:

パフォーマンス カウンターを使用すると、見つけた最初の値を取得するだけでは簡単ではありません。値を取得するには、少なくとも 2 回 (間隔を置いて) ポーリングする必要があります。

これは必ずしも実際のシナリオでこれを実装する方法ではありませんが、アイデアは次のとおりです。

var coreUsages = new PerformanceCounter[Environment.ProcessorCount];

for (var i = 0; i < coreUsages.Length; i++)
{
     coreUsages[i] = new PerformanceCounter("Processor", "% Processor Time", i.ToString());
     coreUsages[i].NextValue();
}

Thread.Sleep(1000);

for (var i = 0; i < coreUsages.Length; i++)
{
     //using the status bar as output for now, doesn't really matter
     Trace.WriteLine("   |   " + coreUsages[i].CounterName + " ~ " + coreUsages[i].NextValue());
}
于 2012-05-17T15:03:54.933 に答える
0

実験の目的で、 の下のクラスGetCurrentProcess()から使用できると思います。返されたプロセスから、コアあたりの使用量を計算するコードに基づいて、検出された使用率が最も低いコアにプロパティを設定できます。ProcessSystem.DiagnosticsProcessAffinity

他の人が述べたように、実際のアプリケーションでこれを試してみるのは悪い考えです。

于 2012-05-17T15:39:56.720 に答える
0
于 2012-05-17T15:37:28.210 に答える