長時間実行する操作を別々のスレッドで実行すると、PCに複数のプロセッサコアがある場合にパフォーマンスが大幅に向上します。 C#には関数Parallel.ForEach
がありますが、これはどのように理解すると、各プロセッサコアで実行される別々のスレッドで長時間実行される操作を分割します。ただし、コアが1つしかない場合、この機能は単純なForeach
ループ(同期)として実行されます。また、プロセッサコアより多くのスレッドを作成している場合は、悪影響が及ぶこともあります。長時間実行しているタスクを別々のプロセスに分割してプログラムのパフォーマンスを向上
別のコンソールアプリケーションを作成することを考えていましたが、それにargs
を渡して、start -WindowStyle Hidden SeparateProcess.exe
のような複数のプロセスで.exeを実行します。
編集:
私はすでにPowerShellを使用して、その後、この
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 100; i++)
{
Thread.Sleep(200);
Console.WriteLine("" + i);
}
Console.WriteLine();
Console.WriteLine(Guid.NewGuid() + ": Process finalized.");
}
}
のようなコンソールアプリケーションを作成し、それを何度も実行:単一に実行したとき
For ($i=0; $i -lt 10; $i++){
start -WindowStyle Normal SeparateProcess.exe
}
は、このプログラムのパフォーマンスが向上しますコア?
注:長時間実行されるタスクは、Emgu CV画像計算アルゴリズムです。
マルチスレッドは、複数のコアを利用するだけではありません。アプリケーションとスレッドが何をするかによって、単一のコアマシン上で実行されるマルチスレッドアプリケーションは、単一のコア上で実行される単一のスレッドアプリケーションよりもパフォーマンスが向上する可能性があります。 複数のプロセスの1つの大きな欠点は、メモリやリソースを共有できないことです。一方、複数のスレッドを持つ単一のプロセスでは可能です。 – RavB
あなたのプロセスはCPUバウンドではありません。ほとんどの時間はスリープします。改善されたパフォーマンスはどのように見えますか?それはまだ200ミリ秒100回スリープ状態になり、ほぼ同じ時間かかる。書き込みはすべて同じ時間がかかります。 –
@RavBマルチコアコンピュータはたった10年しか共有されていませんが、シングルコアだけのマシンでは複数のスレッドを使用する理由がたくさんあります(結局のところ、何十年もの間スレッド化が一般的に使用されていました) )しかし、その理由はパフォーマンスではありません。単一のコアマシンでは、マルチスレッドコードは常にパフォーマンスが悪くなります(同じ作業をしてもスレッドオーバーヘッドを持つため)が、スレッドオーバーヘッドにもかかわらず役に立ちます。 – Servy