11

Snow Leopardで導入されたオブジェクトをブロックするのに適していることの1つは、以前はコールバックで処理されていた状況です。構文は、コンテキストを渡すためにはるかにクリーンです。ただし、この方法でブロックを使用した場合のパフォーマンスへの影響に関する情報は見たことがありません。ブロックを使用する場合、特にCスタイルのコールバックの代わりとして、パフォーマンスの落とし穴に注意する必要がある場合はどうすればよいですか?

4

2 に答える 2

11

The blocks runtime looks pretty tight. Block descriptors and functions are statically allocated, so they could enlarge the working set of your program, but you only "pay" in storage for the variables you reference from the enclosing scope. Non-global block literals and __block variables are constructed on the stack without any branching, so you're unlikely to run into much of a slowdown from that. Calling a block is just result = (*b->__FuncPtr)(b, arg1, arg2); this is comparable to result = (*callback_func_ptr)(callback_ctx, arg1, arg2).

If you think of blocks as "callbacks that write their own context structure and handle the ugly packing, memory management, casting, and dereferencing for you," I think you'll realize that blocks are a small cost at runtime and a huge savings in programming time.

于 2010-04-21T04:56:14.293 に答える
6

このブログ投稿これをチェックしてみてください。ブロックは、スタックに配置できることを除いて、Objective-C オブジェクトとして実装されるため、必ずしもmalloc'd にする必要はありません (ただし、ブロックへの参照を保持している場合は、ヒープにコピーされます)。したがって、それらはおそらくほとんどの Objective-C オブジェクトよりも優れたパフォーマンスを発揮しますが、単純なコールバックと比較してわずかにパフォーマンスが低下します。95% の確率で問題になることはないと思います。

于 2010-04-21T04:42:20.927 に答える