【问题标题】:What is the performance difference between blocks and callbacks?块和回调之间的性能差异是什么?
【发布时间】:2010-04-21 04:19:38
【问题描述】:

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

【问题讨论】:

    标签: objective-c objective-c-blocks


    【解决方案1】:

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

    如果您将块视为“编写自己的上下文结构并为您处理丑陋的打包、内存管理、强制转换和取消引用的回调”,我想您会意识到块在运行时的成本很低,并且节省大量编程时间。

    【讨论】:

      【解决方案2】:

      您可能想查看this blog postthis one。块被实现为Objective-C对象,除了它们可以放在堆栈上,所以它们不一定必须是malloc'd(如果你保留对块的引用,它将被复制到堆上,尽管)。因此,它们可能会比大多数 Objective-C 对象执行得更好,但与简单的回调相比,性能会受到轻微影响——我猜 95% 的情况下它不应该是一个问题。

      【讨论】:

      • 对 Mike Ash 的帖子表示欢迎。
      • 还有一点值得一提的是,与回调相比,块捕获机制。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      • 1970-01-01
      • 2011-06-05
      相关资源
      最近更新 更多