¿Cuál es la diferencia de rendimiento entre los bloques y las devoluciones de llamada?

StackOverflow https://stackoverflow.com/questions/2680292

  •  30-09-2019
  •  | 
  •  

Pregunta

Una de las cosas que los objetos de bloque, introducidos en Snow Leopard, son buenos para situaciones es que previamente han sido manejados con devoluciones de llamada. La sintaxis es mucho más limpio para pasar alrededor de contexto. Sin embargo, no he visto ninguna información sobre las implicaciones de rendimiento de la utilización de bloques de esta manera. Lo que, en su caso, las trampas de rendimiento que deben tener en cuenta cuando el uso de bloques, sobre todo como un reemplazo para una devolución de llamada al estilo de C?

¿Fue útil?

Solución

Los bloques de runtime se ve bastante ajustado. Bloque descriptores y funciones se asignan estáticamente, para que pudieran ampliar el espacio de trabajo de su programa, pero sólo "pago" en el almacenamiento de las variables que hacen referencia a separarse del alcance de cerramiento. No global literales y variables de bloque __block se construyen en la pila sin ninguna ramificación, por lo que es poco probable que ejecutar en gran parte de una desaceleración de eso. Llamar a un bloque es simplemente result = (*b->__FuncPtr)(b, arg1, arg2); esto es comparable a result = (*callback_func_ptr)(callback_ctx, arg1, arg2).

Si se piensa en bloques como "devoluciones de llamada que escriben su propia estructura de contexto y manejan el embalaje feo, gestión de memoria, de fundición, y la eliminación de referencias para usted," Creo que se dará cuenta de que los bloques son un pequeño coste en tiempo de ejecución y una un gran ahorro en el tiempo de programación.

Otros consejos

Es posible que desee echa un vistazo a este blog publicar y éste . Los bloques se implementan como objetos de Objective-C, excepto que se pueden poner en la pila, por lo que no necesariamente tienen que ser malloc'd (si no conserva una referencia a un bloque, se copiará en el montón, sin embargo) . Ellos por lo tanto, probablemente, un mejor desempeño que la mayoría de los objetos de Objective-C, pero tendrán un pequeño impacto de rendimiento en comparación con un simple devolución de llamada - Me supongo que no debería ser un problema el 95% del tiempo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top