代码之家  ›  专栏  ›  技术社区  ›  Don

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

  •  11
  • Don  · 技术社区  · 14 年前

    在snow leopard中引入的阻塞对象的一个优点是,以前使用回调处理的情况是很好的。语法对于传递上下文来说要干净得多。但是,我还没有看到任何关于以这种方式使用块的性能影响的信息。在使用块(尤其是作为c风格回调的替代)时,我应该注意哪些性能缺陷(如果有的话)?

    2 回复  |  直到 13 年前
        1
  •  11
  •   Jeremy W. Sherman    14 年前

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

    如果你认为块是“编写自己的上下文结构并为你处理难看的打包、内存管理、转换和取消引用的回调”,我想你会意识到块在运行时是一个小成本,在编程时间上是一个巨大的节省。

        2
  •  6
  •   shosti    14 年前

    你可能想退房 this blog post this one . 块被实现为objective-c对象,除非它们可以放在堆栈上,所以它们不必 malloc 'd(如果保留对块的引用,则会将其复制到堆中)。因此,它们的性能可能比大多数objective-c对象要好,但与简单的回调相比,性能会稍有下降——我想95%的情况下,这不应该是个问题。