【发布时间】:2010-04-21 04:19:38
【问题描述】:
Snow Leopard 中引入的阻止对象的其中一个优点是以前可以通过回调处理的情况。传递上下文的语法要干净得多。但是,我还没有看到任何有关以这种方式使用块的性能影响的信息。使用块时我应该注意哪些性能缺陷(如果有的话),尤其是作为 C 风格回调的替代品?
【问题讨论】:
标签: objective-c objective-c-blocks
Snow Leopard 中引入的阻止对象的其中一个优点是以前可以通过回调处理的情况。传递上下文的语法要干净得多。但是,我还没有看到任何有关以这种方式使用块的性能影响的信息。使用块时我应该注意哪些性能缺陷(如果有的话),尤其是作为 C 风格回调的替代品?
【问题讨论】:
标签: objective-c objective-c-blocks
块运行时看起来很紧凑。块描述符和函数是静态分配的,因此它们可以扩大程序的工作集,但您只需为从封闭范围引用的变量“支付”存储费用。非全局块文字和__block 变量是在堆栈上构造的,没有任何分支,因此您不太可能因此而减速。调用块只是result = (*b->__FuncPtr)(b, arg1, arg2);这相当于result = (*callback_func_ptr)(callback_ctx, arg1, arg2)。
如果您将块视为“编写自己的上下文结构并为您处理丑陋的打包、内存管理、强制转换和取消引用的回调”,我想您会意识到块在运行时的成本很低,并且节省大量编程时间。
【讨论】:
您可能想查看this blog post 和this one。块被实现为Objective-C对象,除了它们可以放在堆栈上,所以它们不一定必须是malloc'd(如果你保留对块的引用,它将被复制到堆上,尽管)。因此,它们可能会比大多数 Objective-C 对象执行得更好,但与简单的回调相比,性能会受到轻微影响——我猜 95% 的情况下它不应该是一个问题。
【讨论】: