Tengo curiosidad por saber el costo del envío de mensajes en Objective-C en diversas situaciones. Particularmente, quiero guiar mi elección del diseño del programa, por lo que no me siento tentado a optimizar prematuramente al evitar el envío de mensajes cuando se trata de un mejor diseño.Costo del envío de mensajes en Objective-C
Un caso en mi proyecto actual es que tengo una clase con variables de instancia: offsetX y offsetY. A menudo quieren compensar el absoluto y por el momento no tengo esta línea de código por todo el lugar: -
int absOffset = ((offsetX < 0.0) ? -offsetX : offsetX) +
((offsetY < 0.0) ? -offsetY : offsetY);
Ahora bien, si esto era C++ crearía una función en línea que devuelve el valor de absOffset. Incluso en Java/C# podría definir una función como final/sellada y estar bastante seguro de que estaría en línea.
El objetivo-C sería la siguiente: -
-(int)absOffset {
return ((offsetX < 0.0) ? -offsetX : offsetX) +
((offsetY < 0.0) ? -offsetY : offsetY);
}
y yo lo llamaría así: -
int ao = [self absOffset];
Ahora, es el compilador capaz de línea que? Supongo que es capaz, al menos, de corregirlo en una llamada a función directa y evitar el envío de mensajes dinámicos que (supongo) objetivo-c debe usar debido a su tipo de sistema.
Además, en general, ¿cuánto cuesta el envío de mensajes en el objetivo C? ¿Difiere al llamar a través de un 'id' frente a un puntero a una clase concreta?
+1. Vale la pena señalar que el código de mensajería está escrito en un código ensamblador altamente optimizado, que se encuentra aquí: http://opensource.apple.com/source/objc4/objc4-371.2/runtime/Messengers.subproj/ –
I ' Me estoy rascando la cabeza ante los números de Mike Ash por los costos operativos. Ejecuté una medición similar de sobrecarga de llamada virtual en C++, y el tiempo que obtuve para cada indirecto virtual en un procesador de 3.3GHz fue más como 7ns que su 1. – Crashworks
Según el enlace publicado, una llamada a función virtual requiere 1.1ns mientras que un objetivo- El envío de C tarda 4.9ns, que es casi 5 veces más lento. Tan rápido como el despachador se supone que puede ser un éxito en las circunstancias correctas. ¡Definitivamente estoy de acuerdo en evitar una optimización prematura! – fbrereto