1. ホーム
  2. c#

[解決済み] IOバウンド処理にはThreadPoolsとタスク並列ライブラリのどちらを使用すべきか?

2023-07-26 09:03:02

質問

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

もし私が逐次的なアプローチを使用するなら、多数のリソースがある場合、それらすべてを処理するのに非常に時間がかかります(ネットワークの問題や同様のもののため)。

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はシーケンシャルなアプローチと同じように動作するのでしょうか、それとも並行処理が可能なのでしょうか?私はすでに Microsoft .NETによる並列プログラミング を読んでいるので 書籍 のようなものがありますが、これに対する正確な答えが見つかりませんでした。

注:これは私の以前の質問の再フレーズです[ ]。 スレッド同時実行と並列処理を一緒に使用することは可能ですか? ]ですが、これはかなり間違った言い回しでした。

どのように解決するのですか?

ということで、テストを書いて、実際のデータで見てみることにしました。

テスト凡例

  • 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] -- HyprerThreading Supported -- 。

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
________________________________________________________________________________

要約

  • シングルコア環境でもマルチコア環境でも、並列拡張機能、TPL、スレッドプール は同じ振る舞いをし、おおよその結果を出します。 .
  • まだ TPL があります。 の利点があります。 簡単で 例外処理、キャンセルサポート、そしてタスクの結果を簡単に返すことができることです。 . Parallel Extensionsも有力な選択肢の一つですが。

自分自身でテストを実行する

ソースをダウンロードすることができます はこちら をダウンロードし、自分で動かしてみてください。もし、結果を投稿していただけるなら、私も追加します。

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