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