Moderne CPUs verfügen über umfangreiches Pipelining, d. h. sie laden notwendige Anweisungen und Daten, lange bevor sie die Anweisung tatsächlich ausführen.
Manchmal werden die in die Pipeline geladenen Daten ungültig, und die Pipeline muss gelöscht und mit neuen Daten neu geladen werden. Die Zeit, die zum Auffüllen der Pipeline benötigt wird, kann beträchtlich sein und zu einer Leistungsverlangsamung führen.
Wenn ich einen Funktionszeiger in C aufrufe, ist die Pipeline intelligent genug, um zu erkennen, dass der Zeiger in der Pipeline ein Funktionszeiger ist und diesem Zeiger für die nächsten Anweisungen folgen sollte? Oder führt ein Funktionszeiger dazu, dass die Pipeline gelöscht und die Leistung verringert wird?
Ich arbeite in C, aber ich stelle mir vor, dass dies in C++ noch wichtiger ist, wo viele Funktionsaufrufe über V-Tabellen erfolgen.
bearbeiten
@JensGustedt schreibt:
Um ein echter Performance-Hit für Funktionsaufrufe zu sein, muss die aufgerufene Funktion extrem kurz sein. Wenn Sie dies beim Messen Ihres Codes beobachten, sollten Sie Ihr Design definitiv überdenken, damit dieser Aufruf inliniert werden kann
Leider könnte das die Falle sein, in die ich getappt bin.
Ich habe die Zielfunktion aus Leistungsgründen klein und schnell geschrieben.
Aber er wird von einem Funktionszeiger referenziert, so dass er leicht durch andere Funktionen ersetzt werden kann (machen Sie den Zeiger einfach auf eine andere Funktion referenzieren!). Da ich über einen Funktionszeiger darauf verweise, glaube ich nicht, dass es inline sein kann.
Ich habe also eine extrem kurze, nicht eingebettete Funktion.
Ich denke, es hängt bis zu einem gewissen Grad von der Plattform ab; Können wir davon ausgehen, dass Sie von x86 sprechen?
– Oliver Charlesworth
25. Mai 2012 um 15:34 Uhr
Ja, x86. (64-Bit, Core2, um genauer zu sein)
– abelenky
25. Mai 2012 um 15:35 Uhr
Unterscheidet sich ein Funktionszeiger von einem normalen Funktionsaufruf?
– Martin Beckett
25. Mai 2012 um 15:39 Uhr
@MartinBeckett: Nun, es beinhaltet eine zusätzliche Ebene der Umleitung …
– Oliver Charlesworth
25. Mai 2012 um 15:43 Uhr
@OliCharlesworth – und es kann zur Kompilierzeit nicht vorhergesagt werden, nehme ich an
– Martin Beckett
25. Mai 2012 um 15:59 Uhr