0

私のマルチスレッド アプリケーションは、HD からいくつかのファイルを取得し、このファイル内のデータを処理します。クラス (dataProcessing) の同じインスタンスを再利用してスレッドを作成します (呼び出しメソッドのパラメーターを変更するだけです)。

processingThread[i] = new Thread(new ThreadStart(dataProcessing.parseAll));

原因がすべてのスレッドが同じメモリから読み取っている可能性があるかどうか疑問に思っています。

各ファイルの処理には約 30 分かかります。ファイルはわずか 200 KB であるため、すぐに読み取られます。ファイルを処理した後、すべての結果を 1 つの宛先ファイルに書き込みます。問題がディスクの読み取りまたは書き込みにあるとは思いません。すべてのスレッドがタスクに取り組んでいますが、何らかの理由でプロセッサが十分に使用されていません。スレッドを追加して、プロセッサの使用率が 100% に達するかどうかを確認しようとしましたが、完全に使用するのではなく、速度が低下し、処理の使用量が減少するところまで来ました。誰が何が間違っているのか考えていますか?

4

1 に答える 1

0

考慮すべきポイントを次に示します。

  1. 現在のほとんどの CPU はハイパー スレッドです。OS は各ハイパー スレッド コアに 2 つのパイプラインがあると想定していますが、これは当てはまらず、CPU と実行している算術演算に大きく依存します。ほとんどの CPU では、各パイプラインに 2 つの整数ユニットがありますが、FP は 1 つしかないため、ほとんどの FP 操作はハイパースレッド アーキテクチャの恩恵を受けていません。

  2. ファイルはわずか 200k であるため、すべてがキャッシュにコピーされているとしか考えられないため、これはメモリ/ディスクの問題ではありません。

  3. 外部 DLL を使用していますか? ネイティブ Bitmap クラスを使用した JPEG ファイルの読み取り/保存などの一部の操作は並列ではなく、一度に複数の実行を行っても速度が向上しません。

  4. スレッド間の切り替えが実行中の操作よりもコストがかかるポイントに到達すると、パフォーマンスが低下します。

  5. データを読み取るだけですか、それとも変更しますか? 各スレッドがデータも変更する場合、キャッシュには多くのロックが存在します。各スレッドが独自のメモリに独自のデータを収集し、すべてのスレッドがジョブを実行した後でのみ、すべてのデータを結合することをお勧めします。

于 2012-04-15T15:14:10.817 に答える