[解決済み] IOバウンド処理にはThreadPoolsとタスク並列ライブラリのどちらを使用すべきか?
質問
私のプロジェクトの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も有力な選択肢の一つですが。
自分自身でテストを実行する
ソースをダウンロードすることができます はこちら をダウンロードし、自分で動かしてみてください。もし、結果を投稿していただけるなら、私も追加します。
更新しました。ソースのリンクを修正しました。
関連
-
[解決済み】プログラム実行中に1秒待つ
-
[解決済み】C#で四捨五入する方法
-
[解決済み] [Entity Framework 4.1でエンティティに関連オブジェクトを追加する際に、エンティティオブジェクトをIEntityChangeTracker.の複数のインスタンスから参照できない。
-
[解決済み] DBNullから他の型にオブジェクトをキャストすることができない
-
[解決済み】バックスラッシュを含むパス文字列のエスケープシーケンスが認識されない件
-
[解決済み】C# - パスに不正な文字がある場合
-
[解決済み】Moqを使用してメソッド呼び出しを検証する
-
VSでscanfエラーを恒久的に解決するには、ソースファイルを作成し、自動的に#define _CRT_SECURE_NO_WARNINGS 1を追加してください。
-
[解決済み] ThreadLocal変数はいつ、どのように使用すればよいですか?
-
[解決済み】Task<T>の完了をタイムアウトで非同期に待つ
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C#で四捨五入する方法
-
[解決済み】"The ConnectionString property has not been initialized "を修正する方法
-
[解決済み】非静的メソッドはターゲットを必要とする
-
[解決済み】「...は'型'であり、与えられたコンテキストでは有効ではありません」を解決するにはどうすればよいですか?(C#)
-
[解決済み】ファイルへの読み書きの際に共有違反のIOExceptionが発生する C#
-
[解決済み】パラメータ付きRedirectToAction
-
[解決済み】「namespace」なのに「type」のように使われる。
-
VSでscanfエラーを恒久的に解決するには、ソースファイルを作成し、自動的に#define _CRT_SECURE_NO_WARNINGS 1を追加してください。
-
[解決済み】WebResource.axdとは何ですか?
-
[解決済み】Nullableオブジェクトは値を持たなければならない?