2 Stimmen

Handler-Aufrufgeschwindigkeit: Objective-C vs. virtuelle Funktionen

Ich habe gehört, dass das Aufrufen eines Handlers (Delegaten usw.) in Objective-C möglicherweise sogar schneller ist als das Aufrufen einer virtuellen Funktion in C++. Ist das wirklich korrekt? Wenn ja, wie kann das sein?

Soweit ich weiß, sind virtuelle Funktionen nicht so langsam aufzurufen. Zumindest ist dies mein Verständnis davon, was passiert, wenn eine virtuelle Funktion aufgerufen wird:

  1. Holen Sie sich den Zeiger auf vtbl.
  2. Dereferenzieren Sie den Zeiger und holen Sie den Anfang des Arrays von Funktionszeigern.
  3. Verschieben Sie (in Zeigerskalierung) den Anfang des Arrays um den Index der Methode. Da der Index zur Kompilierzeit bekannt ist, ist es so einfach wie das Hinzufügen eines Vielfachen von uintptr_t.
  4. Geben Sie eine call-Anweisung aus.

Leider kenne ich kein Objective-C, daher ist es für mich schwierig, die Leistung zu vergleichen. Aber zumindest sieht der Mechanismus eines virtuellen Funktionsaufrufs nicht so langsam aus, oder? Wie kann etwas anderes als ein statischer Funktionsaufruf schneller sein?

5voto

Ben Zotto Punkte 68632

Dies ist natürlich alles implementierungsabhängig. Ich weiß nicht, ob ein Obj-C-Methodenaufruf "schneller" sein kann als ein virtueller Funktionsaufruf, aber er kann sicherlich in Frage kommen - es gibt hier eine Diskussion über den Mechanismus auf SO:

Objekt-C-Nachrichtenverteilungsmechanismus

und Mike Ash hat hier mehr:

http://www.mikeash.com/pyblog/friday-qa-2009-03-20-objective-c-messaging.html

Letztendlich können Selektoren zwischengespeichert werden, und wenn der Selektor, den Sie aufrufen, zur Laufzeit zwischengespeichert ist, entspricht die Verteilung ungefähr der Ausführung einer virtuellen Funktionsaufrufoperation.

Außerdem:

  1. Standardmäßiger Haftungsausschluss: Die Leistung dieses Prozesses ist für fast alle Codes im Grunde genommen irrelevant. Es ist nur in einer unglaublich unwichtigen Minderheit der Fälle wichtig. Kann man aus Ihrer Frage nicht herauslesen, aber grundsätzlich sollte dies kein Entscheidungskriterium sein, um herauszufinden, ob man einen Haufen Code rein in Obj-C oder C++ implementieren soll.
  2. Sie können immer das Verhalten beobachten (und die Operationen zählen :) )indem Sie explizit durch den ASM-Code in Xcode gehen - wenn Sie es tun, geben Sie einen Bericht ab!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X