これは問題のプロセスに大きく依存することを理解していますが、経験則はありますか?
使用できるCPUの数を制御progX
するコマンドラインスイッチ()を提供するというマルチスレッドプログラムがあるとします。--cpu
それぞれ1つのCPUを使用して40の並列インスタンスを起動する方が速いですか(progX --cpu 1
)、または40個のCPUを使用するように指示して単一のインスタンスを起動する()の方が速いprogX --cpu 40
ですか?
これは問題のプロセスに大きく依存することを理解していますが、経験則はありますか?
使用できるCPUの数を制御progX
するコマンドラインスイッチ()を提供するというマルチスレッドプログラムがあるとします。--cpu
それぞれ1つのCPUを使用して40の並列インスタンスを起動する方が速いですか(progX --cpu 1
)、または40個のCPUを使用するように指示して単一のインスタンスを起動する()の方が速いprogX --cpu 40
ですか?
一般的なルールは次のとおりです。タスク間に関係がない場合、マルチプロセスバージョンのパフォーマンスはマルチスレッドバージョンのパフォーマンスになりがちです(一部のOSはプロセスを含むスレッドを実装するため、パフォーマンスは厳密に同等になります)。
特にホスティング環境(Javaや.Netなど)を使用している場合は、プロセスを初期化するためにより多くの費用がかかりますが、時間の経過とともに、この初期起動料金はごくわずかになります。
したがって、タスクが小さい場合は大きな違いが生じる可能性がありますが、数時間の間にタスクを実行する場合は無視できます。
スレッド間に何らかの相互作用があると、物事は面白くなります。
共有データ:プロセス間でのメモリの共有は、スレッド間よりも複雑でコストがかかります
同期:プロセスの同期は、特に透過的なスレッド同期に言語構造を使用できる場合は、非常に面倒です。
パフォーマンスはマルチプロセスには適していませんが、信頼性のように使用する理由は他にもあります。プロセスを壊してクラッシュさせる可能性のあるコンポーネントを使用する場合、マルチスレッドアプリケーションを使用している場合、障害が発生すると損失が発生します。マルチプロセスアプリケーションでは1つだけが失敗しますが、すべてのタスクの1つです。
OSに大きく依存しますが、一般にスレッドはプロセスよりも軽量であるため(実際、各プロセスは少なくとも1つのスレッドで構成されます)、40スレッドで1つのプロセスを開始することで、(特にメモリ消費に関して)プレッシャーを軽減できます。システム上。
また、スレッドは共有アドレス空間で動作するため、プロセスとは根本的に異なることを忘れないでください。しかし、あなたが彼らがお互いに通信するかどうかは関係ありません。
単一のインスタンスを起動する方がはるかに高速です。スレッドはその目的のために作られ、処理が軽くなります。事実上のルールは次のとおりです。自分でダーティジョブを実行する必要がない限り、OSにスケジューリングとメモリ管理を実行させます。このようにして、コードははるかにシンプルでクリーンになります。OSには、プロセスとメモリをはるかに効率的に処理するための低レベルのツールが多数あります。もちろんそれはOSに依存しますが、これは最近のOSの一般的なルールであり、少なくとも私が使用しているもの(Linux)です。
最も正確な答えは、小さなタスクを実行し、さまざまな設定でアプリケーションの時間を計ることです。M cpusのN個のプロセスを、それぞれ経由で起動できます。
#!/bin/bash
M=$1
N=$2
for ((i=0; i<$N; i++)) ; do ( echo $i && time progX --cpu $M & ) ; done
重要な時間は最後に印刷された時間です(すべてのプロセスは多かれ少なかれ同時に並行して開始する必要があります)。