¿Cuál es el costo de una llamada al método en Objective-C?

Una nota sobre los selectores: los selectores son cadenas sin clasificar . Se garantiza que cualquiera de los dos selectores en el programa que representan la misma cadena compararán igual (como en ==, igualdad de puntero). Por lo tanto, compararlos por igualdad es tiempo constante. El hash también es tiempo constante: solo puede tomar el valor del puntero como el código hash. Así que piense en ello como un número entero en lugar de una cadena en términos de rendimiento.

Sí, hay una sobrecarga para las llamadas a métodos. Primero necesita ver si el receptor es nulo, en cuyo caso devuelve 0. Luego, debe obtener la clase del receptor y buscar la implementación de ese selector para esa clase. (Si no lo encuentra, hay aún más gastos generales ya que necesita llamar a forwardingTargetForSelector: en el objeto, y si eso falla, necesita construir una invocación y llamar a forwardInvocation: en el objeto). Creo que el anterior- La implementación utilizada para un selector se puede almacenar en caché, para acelerar el caso común cuando será la misma implementación.

Una llamada directa a la función C siempre es más rápida. (No estoy realmente seguro de lo que quiere decir con “funciones estáticas de la vieja escuela”; ¿por qué importa “estático”?) Entonces, si es realmente tan crítico para el rendimiento, puede intentar usar las funciones C y perfilarlo para ver cómo mucha diferencia hace. O, si sabe que usará la misma implementación repetidamente, puede almacenar en caché la implementación (IMP) de un método y llamarla directamente, evitando así la sobrecarga del sistema de envío de mensajes.