2010-04-21 9 views
11

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

11

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.

6

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.

+0

Buena llamada en las publicaciones de Mike Ash. – Don

+0

Una cosa también a mencionar es el mecanismo de captura con bloques en comparación con las devoluciones de llamada. –

Cuestiones relacionadas