1

NSOperationQueue を使用して最初のマルチスレッド iPhone アプリを作成しています。これは、独自のスレッド ディスパッチを管理するよりもロードが優れており、潜在的に高速であると聞いたからです。

ボードを別々のピースに分割し、別々のスレッドで各ボードを計算してから、それらをつなぎ合わせることによって、ライフ ゲーム ボードの結果を計算しています。 . ボードごとに NSInvocationOperation オブジェクトを作成し、それらを OperationQueue に送信しています。ボードのすべてのパーツを送信したら、OperationQueue への waitUntilAllOperationsAreFinished 呼び出しですべての計算が完了するのを待ちます。

これは機能するはずのように見えますが、問題なく機能しますが、スレッドが非常にスローアウトされるため、マルチスレッド バージョンではシングル スレッド バージョンよりも計算に時間がかかります。ああ、いや!NSOperationQueue に送信された NSOperations の作成と終了を監視したところ、後で呼び出されるまでしばらくの間、Operation Queue do-diddly-daddlin に留まっているものがあることがわかりました。最初は、「キューが一度に処理できるスレッドの数は非常に多いかもしれない」と考えてから、キューの maxConcurrentOperationCount を任意の高い数値 (ボードピースの量をはるかに超える) に上げましたが、同じことを経験しました!

誰かが NSOperationQueue を「オーバードライブ」に追い込む方法を教えて、キューをできるだけ早くディスパッチするように言うことができるかどうか疑問に思っていました.それか、何が起こっているのか教えてください!

4

2 に答える 2

1

スレッドが魔法のようにプロセッサーを高速化するわけではありません。

シングル プロセッサ マシンで、アルゴリズムの実行に 100 万命令が必要な場合、それを 100,000 命令の 10 チャンクに分割し、10 スレッドで実行しても、同じくらい時間がかかります。実際には、スレッド間の分割、マージ、およびコンテキスト切り替えのオーバーヘッドが追加されているため、もっと時間がかかります。

于 2010-07-14T18:06:48.080 に答える
0

キューは依然として電話の処理能力によって根本的に制限されています。電話が同時に 2 つのプロセスしか実行できない場合は、タスクを分割することで (せいぜい) 速度が 2 倍近く向上します。それ以上のものは、オーバーヘッドを追加するだけで何の利益もありません。

これは、ボード計算のようなプロセッサとメモリを集中的に使用するルーチンを実行している場合に特に当てはまります。NSOperationQueue は、長時間待機する必要がある操作がいくつかある場合に適しています。ユーザー インターフェイス ループとネットワーク ダウンロードは、優れた例です。このような場合、非アクティブな操作が入力を待っている間に、他の操作が完了する可能性があります。

ボードのようなものでは、グリッドの各部分の操作に待機条件はありません。完了するまで、常に全速力でかき回しています。

参照: iPhone 最大スレッド制限? 同時実行アプリケーションの設計

于 2010-07-14T18:01:16.713 に答える