Ihre Frage hat mich neugierig gemacht, also habe ich einige Timings auf der 3-GHz-PowerPC-CPU ausgeführt, mit der wir arbeiten. Der Test, den ich durchführte, bestand darin, eine einfache 4d-Vektorklasse mit get / set-Funktionen zu erstellen
class TestVec
{
float x,y,z,w;
public:
float GetX() { return x; }
float SetX(float to) { return x=to; } // and so on for the other three
}
Dann habe ich drei Arrays eingerichtet, die jeweils 1024 dieser Vektoren enthalten (klein genug, um in L1 zu passen), und eine Schleife ausgeführt, die sie 1000 Mal zueinander addiert (Ax = Bx + Cx). Ich habe dies mit den als inline
, definierten Funktionen virtual
und regulären Funktionsaufrufen ausgeführt. Hier sind die Ergebnisse:
- Inline: 8 ms (0,65 ns pro Anruf)
- direkt: 68 ms (5,53 ns pro Anruf)
- virtuell: 160 ms (13 ns pro Anruf)
In diesem Fall (wo alles in den Cache passt) waren die virtuellen Funktionsaufrufe etwa 20-mal langsamer als die Inline-Aufrufe. Aber was bedeutet das wirklich? Jede Fahrt durch die Schleife verursachte genau 3 * 4 * 1024 = 12,288
Funktionsaufrufe (1024 Vektoren mal vier Komponenten mal drei Aufrufe pro Addition), so dass diese Zeiten 1000 * 12,288 = 12,288,000
Funktionsaufrufe darstellen. Die virtuelle Schleife dauerte 92 ms länger als die direkte Schleife, sodass der zusätzliche Overhead pro Aufruf 7 Nanosekunden pro Funktion betrug .
Daraus schließe ich: Ja , virtuelle Funktionen sind viel langsamer als direkte Funktionen, und nein , es sei denn, Sie planen, sie zehn Millionen Mal pro Sekunde aufzurufen, spielt es keine Rolle.
Siehe auch: Vergleich der generierten Baugruppe.