块和回调之间的性能差异是什么?

时间:2010-04-21 04:19:39

标签: objective-c objective-c-blocks

Snow Leopard中引入的一个阻止对象的东西很适合以前用回调处理过的情况。传递上下文的语法更清晰。但是,我没有看到任何有关以这种方式使用块的性能影响的信息。在使用块时,我应该注意哪些性能缺陷,特别是作为C风格回调的替代?

2 个答案:

答案 0 :(得分:11)

块运行时看起来非常紧张。块描述符和函数是静态分配的,因此它们可以扩大程序的工作集,但是您只需在存储中“支付”您从封闭范围引用的变量。非全局块文字和__block变量是在堆栈上构建的,没有任何分支,因此您不太可能遇到大幅减速。调用块只是result = (*b->__FuncPtr)(b, arg1, arg2);这与result = (*callback_func_ptr)(callback_ctx, arg1, arg2)相当。

如果你认为块是“编写自己的上下文结构的回调并为你处理丑陋的打包,内存管理,转换和解除引用”,我想你会发现块在运行时的成本很低节省了大量的编程时间。

答案 1 :(得分:6)

您可能需要查看this blog postthis one。块被实现为Objective-C对象,除了它们可以放在堆栈上,因此它们不一定必须是malloc'd(如果你保留对块的引用,它将被复制到尽管如此)。因此,它们可能比大多数Objective-C对象表现更好,但与简单的回调相比会有轻微的性能损失 - 我猜它在95%的时间内都不应该成为问题。