2010-04-21 37 views
11

在Snow Leopard中引入的阻挡对象的一个​​优点是以前用回调处理的情况。语法在传递上下文时更清晰。但是,我没有看到有关以这种方式使用块的性能影响的任何信息。在使用块时,我应该注意什么(如果有的话)性能缺陷,特别是作为C风格回调的替代品?块和回调之间的性能差异是什么?

回答

11

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

如果你认为块是“写回自己的上下文结构并为你处理难看的打包,内存管理,转换和解引用的回调函数”,我想你会意识到块在运行时是很小的代价,节省了大量的编程时间。

6

您可能想要查看this blog postthis one。块被实现为Objective-C对象,除非它们可以放在堆栈中,所以它们不一定是malloc'd(如果保留对块的引用,它将被复制到堆上,但是) 。因此,它们可能会比大多数Objective-C对象表现得更好,但与简单的回调相比,性能会有所下降 - 我猜测95%的时间应该不成问题。

+0

迈克阿什职位好电话。 – Don 2010-04-21 05:11:52

+0

还有一点需要注意的是与回调相比较的区块捕获机制。 – 2014-05-19 12:13:03

相关问题