私の経験はあなたと同じです (ただし、100 スレッドまでではありません。実際にそれだけの数のスレッドが同時に実行されるように、いくつかのインストルメンテーションを入れてください。それほど高くなるのを見たことはありません)。同時操作の数を手動で管理しない限り、NSOperationQueue
非常に多くの同時操作が生成される傾向があります。(ドキュメントからの推論ではなく、テスト可能なコードでこれに反論する人をまだ見たことがありません。) 多数の潜在的な同時操作を生成する可能性のあるものについては、 をお勧めしsetMaxConcurrentOperations
ます。理想的ではありませんが、私はしばしば次のような関数を使用して支援します (もちろん、これはキュー間のバランスをとるのに役立たないため、非常に最適ではありません)。
unsigned int countOfCores() {
unsigned int ncpu;
size_t len = sizeof(ncpu);
sysctlbyname("hw.ncpu", &ncpu, &len, NULL, 0);
return ncpu;
}
NSOperationQueue
CPU バウンド操作の正しい負荷分散を自動的に実行する実際のコードを投稿する人を待ち望んでいます。私が話していることを示すサンプルの要点を投稿しました。を呼び出さないとsetMaxConcurrentOperations:
、2 コアの iPad 3 で約 6 つの並列プロセスが生成されます。競合や共有リソースがないこの非常に単純なケースでは、約 10% ~ 15% のオーバーヘッドが追加されます。競合のあるより複雑なコード (特に操作がキャンセルされる可能性がある場合) では、速度が桁違いに遅くなる可能性があります。