0

私は、WAV ファイルを読み込んでさまざまなデータを収集し、特定の計算を行い、必要な有用な情報を出力するプログラムを作成しました (エンドポイントは音声弁別器です)。これはすべて、個別のクラス オブジェクト内のファイルごとに個別に行われ、それぞれに異なる入力文字列が必要なだけなので、アプリケーションを非常に簡単にスレッド化して、4 倍程度高速に実行できると考えました。

これは私が行ったもので、うまく機能しているようです。ただし、アプリケーション (スレッド対非スレッド) の時間になると、約 3600 個のファイルを処理するのに 1 分間で約 3 秒しかかかりませんでした。これについての私の最善の推測はファイル I/O であり、実装されたすべてのテストでより大きな改善が見られるでしょうが、それは私が特に興味を持っていることではありません。

Win7 でタスク マネージャーを開くと、両方のバージョンのアプリケーションが i3 マシンの 4 つの (仮想) コアすべてで同様のアクティビティを示していましたが、完了時にすべてが最小値になりました。

私の質問: C# コンパイラ、特に Visual Studio は既に複数のコアに最適化されていますか? そうでない場合、何か基本的なことを見逃していませんか?

4

2 に答える 2

1

あなたは TPL を探しています。タスク並列ライブラリ。

具体的には、Parallel.ForEach ステートメントを使用してファイルを処理できます。

ここを参照してください: http://msdn.microsoft.com/en-us/library/dd460720.aspx

于 2013-10-15T14:06:28.103 に答える
0

詳細なしで質問に答えるのは難しいですが、そうでなければさまざまなスレッド関数を正しく実装し、コードを実行しているハードウェアに適切な数のスレッドを使用する場合、CPU 使用率はスレッド化された実装で良好なはずです。

処理に複数のスレッドを使用しない場合、プログラムは単一の CPU / 単一のコアを使用します。それが求められている場合、コンパイラは複数のスレッド用にコードを再配置しません。

シングルスレッド コードとマルチスレッド コードの両方で同じ種類の CPU 使用率が見られる場合は、いくつかの理由が考えられます (コードがわからないため、推測にすぎません)。

  • 使用するスレッドが少なすぎる/多すぎる
  • ディスク I/O が多すぎるため、スレッドから得られるすべての利点が失われます
  • システムで実行されている他のプロセス/スレッドが非常に多いため、測定に干渉します

他にもいくつかの理由があるかもしれませんが、Allan Elder の回答が言及しているように、Parallels ライブラリを試してみることができます。さまざまな要因に基づいて、コードに最適な数のスレッドを選択しようとします。スレッドを接続するための定型コードが自動的に作成されるため、スレッドの使用が非常に簡単になります。

画像ファイルで同様の処理を行ったとき、複数のスレッドを使用すると処理時間が 40% 短縮されました (ただし、ほとんどの画像をメモリにロードしましたが、画像はストリーミングではなかったので、I/O はそれほど重要ではありませんでした)。私の場合、コア使用率もマルチスレッド アプローチの方がはるかに優れていました。1 コアに対して 8 コアでした。

于 2013-10-15T14:06:46.760 に答える