Una de las cosas que bloquea objetos, introducida en Snow Leopard, son buenas para situaciones que anteriormente se hubieran manejado con devoluciones de llamada. La sintaxis es mucho más clara para pasar el contexto. Sin embargo, no he visto ninguna información sobre las implicaciones de rendimiento del uso de bloques de esta manera. ¿Qué riesgos de rendimiento, si es que hay alguno, debo tener en cuenta al usar bloques, particularmente como reemplazo de una devolución de llamada al estilo C?¿Cuál es la diferencia de rendimiento entre bloques y devoluciones de llamada?
Respuesta
El tiempo de ejecución de los bloques parece bastante ajustado. Las descripciones y las funciones de los bloques se asignan estáticamente, por lo que pueden ampliar el conjunto de trabajo de su programa, pero usted solo "paga" en el almacenamiento las variables a las que hace referencia desde el alcance adjunto. Los literales de bloques no globales y las variables __block
se construyen en la pila sin ninguna ramificación, por lo que es poco probable que sufra una gran desaceleración. Llamar a un bloque es solo result = (*b->__FuncPtr)(b, arg1, arg2)
; esto es comparable a result = (*callback_func_ptr)(callback_ctx, arg1, arg2)
.
Si piensa en los bloques como "devoluciones de llamada que escriben su propia estructura de contexto y manejan el embalaje feo, administración de memoria, conversión y desreferenciación para usted", creo que se dará cuenta de que los bloques cuestan poco en tiempo de ejecución y un gran ahorro en tiempo de programación.
Es posible que desee comprobar this blog post y this one. Los bloques se implementan como objetos Objective-C, excepto que se pueden poner en la pila, por lo que no necesariamente tienen que ser malloc
'd (si conservas una referencia a un bloque, se copiará en el montón, sin embargo) . Por lo tanto, probablemente se desempeñen mejor que la mayoría de objetos Objective-C, pero tendrán un pequeño golpe de rendimiento en comparación con una devolución de llamada simple: supongo que no debería ser un problema el 95% del tiempo.
- 1. Diferencia entre controladores de eventos y devoluciones de llamada
- 2. ¿Cuál es la diferencia entre los observadores y las devoluciones de llamada?
- 3. ¿Cuál es la diferencia de rendimiento entre HttpModule y Global.aspx?
- 4. Cierre y devoluciones de llamada
- 5. ¿Cuál es la diferencia entre dict() y {}?
- 6. Cuál es la diferencia entre = y: =
- 7. ¿Cuál es la diferencia entre [indefinido] y [,]?
- 8. ¿Cuál es la diferencia entre "$^N" y "$ +"?
- 9. ¿cuál es la diferencia entre:.! y: r !?
- 10. ¿Cuál es la diferencia entre ".equals" y "=="?
- 11. ¿Cuál es la diferencia entre {0} y ""?
- 12. ¿Cuál es la diferencia entre .ToString (+) y ""
- 13. Cuál es la diferencia entre $ (...) y `...`
- 14. ¿Cuál es la diferencia entre `##` y `hashCode`?
- 15. ¿Cuál es la diferencia entre + = y = +?
- 16. ¿Cuál es la diferencia entre " " y ""?
- 17. Cuál es la diferencia entre $ y jQuery
- 18. ¿Cuál es la diferencia entre vmalloc y kmalloc?
- 19. Delegados y devoluciones de llamada
- 20. ¿Cuál es la diferencia de rendimiento entre fetchall_hashref y fetchall_arrayref de DBI?
- 21. diferencia entre la llamada por referencia y llamada por valor
- 22. ¿Cuál es la diferencia entre String.matches y Matcher.matches?
- 23. ¿Cuál es la diferencia entre arrancar y recolectar en Rails?
- 24. ¿Cuál es la diferencia entre is_a y instanceof?
- 25. ¿Cuál es la diferencia entre LinkedBlockingQueue y ConcurrentLinkedQueue?
- 26. ¿Cuál es la diferencia entre el mango y el hilo?
- 27. ¿Cuál es la diferencia entre AntiXss.HtmlEncode y HttpUtility.HtmlEncode?
- 28. ¿Cuál es la diferencia de rendimiento entre "insertar ignorar" y reemplazar en MySQL?
- 29. ¿cuál es la diferencia entre alloc y allocWithZone :?
- 30. ¿Cuál es la diferencia entre file_get_contents y fread
Buena llamada en las publicaciones de Mike Ash. – Don
Una cosa también a mencionar es el mecanismo de captura con bloques en comparación con las devoluciones de llamada. –