在Snow Leopard中引入的阻挡对象的一个优点是以前用回调处理的情况。语法在传递上下文时更清晰。但是,我没有看到有关以这种方式使用块的性能影响的任何信息。在使用块时,我应该注意什么(如果有的话)性能缺陷,特别是作为C风格回调的替代品?块和回调之间的性能差异是什么?
11
A
回答
11
块运行时看起来非常紧张。块描述符和函数是静态分配的,所以它们可以放大程序的工作集,但是您只需在存储器中为您从封闭范围引用的变量“付钱”。非全局块文字和__block
变量在堆栈上构建而没有任何分支,因此您不太可能遇到大幅减速。调用一个块只是result = (*b->__FuncPtr)(b, arg1, arg2)
;这与result = (*callback_func_ptr)(callback_ctx, arg1, arg2)
相当。
如果你认为块是“写回自己的上下文结构并为你处理难看的打包,内存管理,转换和解引用的回调函数”,我想你会意识到块在运行时是很小的代价,节省了大量的编程时间。
6
您可能想要查看this blog post和this one。块被实现为Objective-C对象,除非它们可以放在堆栈中,所以它们不一定是malloc
'd(如果保留对块的引用,它将被复制到堆上,但是) 。因此,它们可能会比大多数Objective-C对象表现得更好,但与简单的回调相比,性能会有所下降 - 我猜测95%的时间应该不成问题。
相关问题
- 1. PCIe和QPI之间的性能和架构差异是什么?
- 2. 什么是self.property的使用和性能之间的差异
- 3. 32位和64位SWT之间的性能差异是什么?
- 4. RTP over UDP和RTSP/RTP之间的性能差异是什么?
- 5. Joomla 1.5,2.5和3.0之间的性能差异是什么?
- 6. JVM方法调用和远程调用之间的性能差异是什么?
- 7. 是什么本地和字节二郎模块之间的性能差异?
- 8. 在Play框架中Morphia和MongoDB模块之间的性能差异是什么?
- 9. 是什么在卢阿块与块之间的差异
- 10. jconn2和jconn3之间的性能差异
- 11. .exists之间的性能差异?和.where.present?
- 12. drawBitmap和createScaledBitmap之间的性能差异
- 13. to_char和to_date之间的性能差异
- 14. Swazoo和Komanche之间的性能差异?
- 15. 类和结构之间的基本功能差异是什么?
- 16. AspectJ和PostSharp之间的功能差异是什么?
- 17. Django中DEBUG = True和False之间的功能差异是什么?
- 18. 是什么inflaters之间的差异
- 19. 什么是Java中的回调和观察者模式之间的差异
- 20. 什么之间的差异(和[?
- 21. 原生2d绘图API和HTML5 canvas API之间的性能差异是什么?
- 22. 单引号和双引号html属性之间的功能差异是什么?
- 23. 本机Canvas API和html5 canvas API之间的性能差异是什么?
- 24. 为什么两个查询之间的性能差异?
- 25. 为什么R()和lapply()之间的性能差异如此之大?
- 26. 为什么Thread和Task之间的性能差异如此之大?
- 27. 同步和AJAX调用之间的性能差异
- 28. array_intersect_key和array_diff_key之间的时间操作差异是什么?
- 29. 是什么收益之间的差异本VS回报新类()
- 30. 什么是类属性和数据之间的差异在Python属性
迈克阿什职位好电话。 – Don 2010-04-21 05:11:52
还有一点需要注意的是与回调相比较的区块捕获机制。 – 2014-05-19 12:13:03