82

アグリゲーターのような私のプロジェクトの 1 つで、Web からのフィードやポッドキャストなどを解析しています。

シーケンシャル アプローチを使用すると、多数のリソースがあるため、それらすべてを処理するにはかなりの時間がかかります (ネットワークの問題や同様のもののため)。

foreach(feed in feeds)
{
   read_from_web(feed)
   parse(feed)
}

したがって、同時実行性を実装したいのですが、基本的に ThreadPools を使用してワーカー スレッドを処理するか、TPL に依存してソートするかを決定できませんでした。

ThreadPools は確かにワーカー スレッドを使用してジョブを処理し、期待どおりの結果が得られます (マルチコア CPU 環境では、他のコアも使用されます)。

同時性

ただ、TPLもおすすめの方法なので検討したいのですが、ちょっと気になります。まず第一に、TPL は ThreadPools を使用していますが、意思決定の層が追加されていることを知っています。私は主にシングルコア環境が存在する状況を懸念しています。私が間違っていなければ、TPL は最初に使用可能な CPU コアの数に等しい数のワーカー スレッドから始まります。私は、TPL が私の IO バウンド ケースのシーケンシャル アプローチと同様の結果をもたらすことを恐れています。

したがって、IO バウンド操作 (私の場合は Web からリソースを読み取る) の場合、ThreadPools を使用して物事を制御するのが最善でしょうか、それとも単に TPL に頼るほうがよいのでしょうか? TPL は IO バウンドのシナリオでも使用できますか?

更新: 私の主な懸念は、シングルコア CPU環境で TPL がシーケンシャル アプローチのように動作するか、それとも同時実行性を提供するかということです。私はすでにParallel Programming with Microsoft .NETを読んでいるので、そのを読んでいますが、これに対する正確な答えを見つけることができませんでした。

注: これは私の以前の質問の言い換えです [ Is it possible to use thread-concurrency and parallelism together? ] これはかなり間違った言い回しでした。

4

6 に答える 6

108

そのため、代わりにこれのテストを作成し、実際のデータで確認することにしました。

テスト凡例

  • Itr: 反復
  • Seq: 順次アプローチ。
  • PrlEx: 並列拡張 - Parallel.ForEach
  • TPL: タスク並列ライブラリ
  • TPool: スレッドプール

試験結果

シングルコアCPU [Win7-32​​] -- VMWareで動作 --

Test Environment: 1 physical cpus, 1 cores, 1 logical cpus.
Will be parsing a total of 10 feeds.
________________________________________________________________________________

Itr.    Seq.    PrlEx   TPL     TPool
________________________________________________________________________________

#1      10.82s  04.05s  02.69s  02.60s
#2      07.48s  03.18s  03.17s  02.91s
#3      07.66s  03.21s  01.90s  01.68s
#4      07.43s  01.65s  01.70s  01.76s
#5      07.81s  02.20s  01.75s  01.71s
#6      07.67s  03.25s  01.97s  01.63s
#7      08.14s  01.77s  01.72s  02.66s
#8      08.04s  03.01s  02.03s  01.75s
#9      08.80s  01.71s  01.67s  01.75s
#10     10.19s  02.23s  01.62s  01.74s
________________________________________________________________________________

Avg.    08.40s  02.63s  02.02s  02.02s
________________________________________________________________________________

シングルコアCPU [WinXP] -- VMWareで動作 --

Test Environment: 1 physical cpus, NotSupported cores, NotSupported logical cpus.
Will be parsing a total of 10 feeds.
________________________________________________________________________________

Itr.    Seq.    PrlEx   TPL     TPool
________________________________________________________________________________

#1      10.79s  04.05s  02.75s  02.13s
#2      07.53s  02.84s  02.08s  02.07s
#3      07.79s  03.74s  02.04s  02.07s
#4      08.28s  02.88s  02.73s  03.43s
#5      07.55s  02.59s  03.99s  03.19s
#6      07.50s  02.90s  02.83s  02.29s
#7      07.80s  04.32s  02.78s  02.67s
#8      07.65s  03.10s  02.07s  02.53s
#9      10.70s  02.61s  02.04s  02.10s
#10     08.98s  02.88s  02.09s  02.16s
________________________________________________________________________________

Avg.    08.46s  03.19s  02.54s  02.46s
________________________________________________________________________________

デュアルコアCPU [Win7-64]

Test Environment: 1 physical cpus, 2 cores, 2 logical cpus.
Will be parsing a total of 10 feeds.
________________________________________________________________________________

Itr.    Seq.    PrlEx   TPL     TPool
________________________________________________________________________________

#1      07.09s  02.28s  02.64s  01.79s
#2      06.04s  02.53s  01.96s  01.94s
#3      05.84s  02.18s  02.08s  02.34s
#4      06.00s  01.43s  01.69s  01.43s
#5      05.74s  01.61s  01.36s  01.49s
#6      05.92s  01.59s  01.73s  01.50s
#7      06.09s  01.44s  02.14s  02.37s
#8      06.37s  01.34s  01.46s  01.36s
#9      06.57s  01.30s  01.58s  01.67s
#10     06.06s  01.95s  02.88s  01.62s
________________________________________________________________________________

Avg.    06.17s  01.76s  01.95s  01.75s
________________________________________________________________________________

クアッドコアCPU [Win7-64] -- ハイパースレッディング対応 --

Test Environment: 1 physical cpus, 4 cores, 8 logical cpus.
Will be parsing a total of 10 feeds.
________________________________________________________________________________

Itr.    Seq.    PrlEx   TPL     TPool
________________________________________________________________________________

#1      10.56s  02.03s  01.71s  01.69s
#2      07.42s  01.63s  01.71s  01.69s
#3      11.66s  01.69s  01.73s  01.61s
#4      07.52s  01.77s  01.63s  01.65s
#5      07.69s  02.32s  01.67s  01.62s
#6      07.31s  01.64s  01.53s  02.17s
#7      07.44s  02.56s  02.35s  02.31s
#8      08.36s  01.93s  01.73s  01.66s
#9      07.92s  02.15s  01.72s  01.65s
#10     07.60s  02.14s  01.68s  01.68s
________________________________________________________________________________

Avg.    08.35s  01.99s  01.75s  01.77s
________________________________________________________________________________

要約

  • シングルコア環境でもマルチコア環境でも、Parallel Extensions、TPL、および ThreadPoolは同じように動作し、おおよその結果が得られます
  • それでもTPLには、簡単な例外処理、キャンセルのサポート、タスクの結果を簡単に返す機能などの利点があります。ただし、Parallel Extensions も別の実行可能な代替手段です。

自分でテストを実行する

ここからソースをダウンロードして、自分で実行できます。結果を投稿できれば、私もそれらを追加します。

更新: ソース リンクを修正しました。

于 2011-03-07T11:47:25.370 に答える
15

IO バウンド タスクのスループットを最大化しようとしている場合は、従来の非同期処理モデル (APM) API を TPL ベースの作業と組み合わせる必要があります。APM API は、非同期 IO コールバックが保留中に CPU スレッドのブロックを解除する唯一の方法です。TPL は、APM と TPL コードの結合を支援するヘルパー メソッドを提供TaskFactory::FromAsyncます

これら 2 つのプログラミング モデルを組み合わせて非同期の極楽を実現する方法の詳細については、MSDN の .NET SDK のこのセクション「TPL と従来の .NET 非同期プログラミング」を参照してください。

于 2011-03-08T01:28:41.817 に答える
2

独自のスレッド プールを作成するときに TPL が制御の一部を削除するのは正しいことです。しかし、これは深く掘り下げたくない場合にのみ正しいです。TPL を使用すると、TPL スレッド プールの一部ではなく、目的に適した長時間実行されるタスクを作成できます。Microsoft .NET を使用した無料の Parallel Programming である発行済みの本は、TPL がどのように使用されることを意図しているかについて、より多くの洞察を与えてくれます。Paralle.For, Tasksに明示的な パラメーターを指定して、割り当てられるスレッドの数をいつでも選択できます。これに加えて、完全な制御が必要な場合は、TPL スケジューラーを独自のものに置き換えることができます。

于 2011-03-06T22:30:35.457 に答える
1

独自のタスク スケジューラを TPL タスクに割り当てることができます。ただし、1 つを盗むデフォルトの作業は非常に巧妙です。

于 2011-03-06T22:26:34.213 に答える
0

私は、TPLがIOバウンドの場合のシーケンシャルアプローチと同様の結果を生み出すことを恐れています。

そうなると思います。ボトルネックは何ですか?解析またはダウンロードですか?マルチスレッドは、Webからのダウンロードにはあまり役立ちません。

タスク並列ライブラリを使用して、トリミング、ダウンロードした画像にマスクやエフェクトを適用したり、ポッドキャストからサンプルを切り取ったりします。よりスケーラブルです。

しかし、それは桁違いのスピードアップではありません。いくつかの機能の実装、テストにリソースを費やしてください。

PS。"私の関数は0.9ではなく0.7秒で実行されます";)

于 2011-03-06T22:15:24.243 に答える