Ich schrieb den folgenden Benchmark den Overhead von virtuellen Funktionen zu schätzen:Virtuelle Funktion Overhead von negativen 0,6ns pro Anruf?
struct A{
int i = 0 ;
virtual void inc() __attribute__((noinline));
};
#ifdef VIRT
struct B : public A{
void inc() override __attribute__((noinline));
};
void A::inc() { }
void B::inc() { i++; }
#else
void A::inc() { i++; }
#endif
int main(){
#ifdef VIRT
B b;
A* p = &b;
#else
A a;
A* p = &a;
#endif
for(;p->i < IT; p->inc()) {; }
return 0;
}
ich es mit
G=$((1000**3))
g++ -O1 -DIT=$((1*G)) -DVIRT virt.cc -o virt
g++ -O1 -DIT=$((1*G)) virt.cc -o nonvirt
Und die Ergebnisse, die ich waren bekam kompilieren, dass nonvirt über 0.6ns als virt langsamer war per Funktionsaufruf bei -O1
und etwa 0,3ns langsamer als virt bei -O2
pro Funktionsaufruf.
Wie ist das möglich? Ich dachte, virtuelle Funktionen sollten langsamer sein.
Richtig. Dieser Loop war ein Tippfehler, der glücklicherweise keinen Einfluss auf das Ergebnis der Benchmark hat. – PSkocik