1

ユーザーがまとめたタスクのリストをまとめて実行しようとしています。これらのタスク リストは、数百または数千のアイテムになる可能性があります。

私の知る限り、最も簡単で明白な方法は、配列を作成してから反復処理することです。

NSArray *arrayOfTasks = .... init and fill with thousands of tasks

for (id *eachTask in arrayOfTasks)
{
  if ( eachTask && [eachTask respondsToSelector:@selector(execute)] ) [eachTask execute];
}

デスクトップの場合は問題ないかもしれませんが、iPhone や iPad の場合は問題になる可能性があります。これは良い方法ですか、それとも同じことをより速く達成する方法はありますか?

msg_send がどのくらいのオーバーヘッドが発生するかについて質問している理由は、単純な C 実装も同様に実行できるからです。たとえば、リンクされたリストをまとめて、ブロックを使用して次のタスクを処理できます。それから何か得るものはありますか?

4

3 に答える 3

7

objc_msgSendその場合、Bill Bumgarner には、読む価値のある優れた 4部構成のシリーズがあります。

ただし、一般的には、単純に Obj-C を使用することをお勧めします。これは、Apple を含む iDevices 用のすべてのアプリが使用するものであり、何百ものアイテムがデバイスを殺すことはありません。

于 2010-06-03T00:05:12.523 に答える
1

rynmrtnが言ったこと...

メソッドが非常に単純化されていない限り-execute(ほんの一握りのスカラー値をインクリメント/テストするobjc_msgSend())、プログラムの CPU 時間の % として表示されることさえありません。

最初に測定し、後で最適化します。

あなたのコードは疑問を投げかけます。arrayOfTasksなぜあなたはできないかもしれないものをに入れているのですかexecutearrayOfTasksあなたのすべてがあなたの作成のサブクラスであると仮定すると、メソッドを追加して、応答テストを実行できexecuteません。コレクション クラスの階層がある場合は、カテゴリを使用してメソッドを追加できます。安全のために接頭辞を付けるだけです (つまり、何か)。pxl_execute

于 2010-06-03T03:49:06.490 に答える
1

これは、 を含む一般的な操作の優れたベンチマーク比較ですobjc_msgSendobjc_msgSend一般に、iPhone であっても、パフォーマンスについて心配する必要はありません。メッセージの送信は、単純な C 関数呼び出しよりも常に遅くなりますが、最新のプロセッサ (iPhone プロセッサはまだ約 500 mhz であることを思い出してください) では、ほとんどの場合、違いは些細なものです。で多くの時間が使用されていることがプロファイリングによって示される場合はobjc_msgSend、Objective-C メソッドの代わりにストレート C 関数を使用する価値があるかもしれません。

わかりやすくするために、オブジェクトを反復処理する代わりに-[NSArray makeObjectsPerformSelector:]or (Mac の場合)を使用できますがenumerateObjectsUsingBlock:、パフォーマンスに大きな違いはないと思います。

于 2010-06-03T04:00:24.260 に答える