8

Xamarin のドキュメントを確認したところ、次のようにマルチスレッド機能に ThreadPool を使用することが推奨されています。

http://docs.xamarin.com/guides/ios/application_fundamentals/threading

ただし、Grand Central Dispatch が ThreadPool よりもはるかにパフォーマンスが高いことを示すベンチマークが行われています。

http://joeengalan.wordpress.com/2012/02/26/execution-differences-between-grand-central-dispatch-and-threadpool-queueuserworkitem-in-monotouch/

したがって、私の質問は、なぜ Xamarin は Grand Central Dispatch よりも ThreadPool を推奨するのですか? Xamarin は最終的に ThreadPool を Grand Central Dispatch に結び付けますか? どちらかを選択するのはいつですか?ThreadPool が Xamarin によって最適化され、最終的に Grand Central Dispatch よりも優れている場合、Grand Central Dispatch を使用したくないからです。

4

2 に答える 2

12

より多くのスレッドを導入することによって、マシン、特にモバイル デバイスから絞り出せる「余分なパフォーマンス」はほとんどありません。

リンクした投稿に対する私のコメントのように(2012年2月から)、リンクした記事の最初の段落で理由が説明されています。

GCD と ThreadPool の違いは、Mono の ThreadPool には「スロー スタート」設定があるため、作業のピーク時に必要以上のスレッドが作成されないことです。あまりにも多くのスレッドを起動することで CPU を簡単に枯渇させることができるため、最初のスレッドが作成された後、スレッドプールはそれ自体を調整し、毎秒新しいスレッドのみを作成しようとします (ギブまたはテイク、実際の詳細は覚えていません)。

ThreadPool に実際に多くのスレッドをスピンアップさせたい場合は、ThreadPool.SetMinThreads で制御できます。

ThreadPool を使用する理由は、同じコードがすべてのプラットフォームで機能するためです。

このドキュメントでは、他の標準の .NET スレッド API よりも ThreadPool使用することについて述べており、GCD を使用するかどうかについては何も述べていないことに注意してください。スレッドを使用して独自の管理を展開するよりも、スレッドプールの方が適しているというだけです。

とはいえ、APIに関しては、最近では、バックグラウンド操作についてスレッドよりもはるかに高レベルの考え方であるTask Parallel Library (TPL) を使用することをお勧めします。さらに、1 行のコードを切り替えるだけで、組み込みのスレッドプールを使用するか、GCD にディスパッチする柔軟性を備えた、プラットフォーム全体で同じ API を取得できます。

于 2013-05-29T13:57:38.143 に答える
2

モノ ( xamarin) スレッド プールの現在の問題は、実行されないことです。

Xamarinデバッガーは、わずか 10 個の同時タスクで停止します。リリースでは、それほど良くはありません。

私の場合、Windows 上の同じコードが Mac 10x 以上で優れています (システム固有のものは何も使用していないことに注意してください)。スレッド プール、非同期メソッド、非同期コールバック (BeginRead など) のさまざまな組み合わせを試しました。

私が推測しなければならないのは、IOSが本質的にシングルスレッドであることへの執着に関連していると推測します。彼らがそれを推奨していることについては、私も推測しています - それは、マルチスレッドに関する限り機能するフレームワークの唯一の部分です。

コードを最適化するために何週間も費やしましたが、マルチスレッドを使用している場合、できることは何もありません。

于 2014-06-23T11:03:15.507 に答える