Was ist schneller? if oder virtual oder...?
-
Hallo, liebe Leute!
Ich schreibe gerade an einem Audioplugin, bei dem ich von vornherein auf eine möglichst performante Programmierung achten möchte.
Ich frage mich nun, wie man am besten in folgender Situation vorgeht:
Ich habe ein so etwas wie einen "Steckplatz" in dem ein vom Benutzer ausgewähltes Modul seine Arbeit verrichten soll. Normalerweise würde man da in der OOP vielleicht einen Pointer auf ein Objekt mit einer virtuellen Funktion in "den Steckplatz" stecken. Ich frage mich aber, ob es vielleicht performanter wäre, dort eine if-Abfrage zu machen und die Module als NICHT dynamisch allozierte member-Objekte auszuführen. Erstens hätte ich dann keinen Verlust bei der virtuellen funktion und zweitens ist es sowieso performanter nicht dynamisch zu allozieren, oder?Ich weiß, man soll nicht zu früh optimieren, aber ich fang lieber schon einmal an, meine Architektur vernünftig auszurichten...
Vieeeelen Dank!
Sören
-
soerenP schrieb:
Ich schreibe gerade an einem Audioplugin, bei dem ich von vornherein auf eine möglichst performante Programmierung achten möchte.
Und schon falsch.
Ich frage mich nun, wie man am besten in folgender Situation vorgeht:
Ich habe ein so etwas wie einen "Steckplatz" in dem ein vom Benutzer ausgewähltes Modul seine Arbeit verrichten soll. Normalerweise würde man da in der OOP vielleicht einen Pointer auf ein Objekt mit einer virtuellen Funktion in "den Steckplatz" stecken. Ich frage mich aber, ob es vielleicht performanter wäre, dort eine if-Abfrage zu machen und die Module als NICHT dynamisch allozierte member-Objekte auszuführen. Erstens hätte ich dann keinen Verlust bei der virtuellen funktion und zweitens ist es sowieso performanter nicht dynamisch zu allozieren, oder?Komplett falscher Ansatz.
Egal was schneller ist (und das ist nur nach langen Performance Tests bestimmbar) beim optimieren gibt es die 80-20 Regel: 80% der Zeit wird in 20% des Codes gemacht. Das sind die Hotspots die man optimieren muss.Ich weiß, man soll nicht zu früh optimieren, aber ich fang lieber schon einmal an, meine Architektur vernünftig auszurichten...
Es ist sehr leicht ein gutes Programm schnell zu machen. Also nimm das gute Design - mit polymorphie. Denn wenn das Design gut ist, kannst du locker caches und andere optimierungen einbauen -> bei schlechtem Design ist das meistens nur sehr schwer moeglich.
Und virtuelle Funktionen sind idR schneller als if Orgien - aber das sollte nie ein Thema sein. Denn der aufruf einer Funktion dauert so extrem kurz, dass man sich darum keinen Kopf machen sollte.
-
Na da ist doch mal ne Aussage.
Danke
Sören
-
wenn du einen richtig cleveren compiler hast, ist es egal, ob du switch/if oder virtual benutzt, um dein polymorphismus zu erzeugen. wenn du kaskadierte if-orgien baust, sind dieses normalerweise langsamer. aber wie shade of mine schon schrieb: das interessiert nicht wirklich.
die zeit wirst du im falle deines audioplugins wohl eher in der mathematik verlieren als in den funktionsaufrufen. oder auch: mach dir verflucht viele gedanken über parallelisierbarkeit und die tricks zur reduktion von befehlen, wo du die daten verarbeitest. aber erst nachdem du weißt, dass du an der stelle wirklich zeit lässt.daher: designe es sauber, schreib ein einfache, direkte implementierung und setzt dich dann mit einem profiler ran und finde raus, wo du die zeit verlierst.
-
Shade Of Mine schrieb:
Und virtuelle Funktionen sind idR schneller als if Orgien - aber das sollte nie ein Thema sein. Denn der aufruf einer Funktion dauert so extrem kurz, dass man sich darum keinen Kopf machen sollte.
Das ist zwar richtig, eine Architektur mit virtuellen Funktionen verhindert aber ggf. andere Optimierungen wie Aufruf-Inlining, was dann wiederum doch ein erhebliches Overhead nach sich ziehen könnte.
Natürlich gilt das von Dir gesagte trotzdem. Außerdem hätte jede Alternativlösung, die virtuelle Funktionen hier umgeht, dieselben Probleme. Ich kenne nur einen konkreten Fall, wo das tatsächlich eine Rolle spielt.
-
Konrad Rudolph schrieb:
Das ist zwar richtig, eine Architektur mit virtuellen Funktionen verhindert aber ggf. andere Optimierungen wie Aufruf-Inlining, was dann wiederum doch ein erhebliches Overhead nach sich ziehen könnte.
das essentielle hier ist: "gegebenenfalls".
Es ist nicht mal 100% sicher dass inlining nicht stattfinden kann

Dafuer hat man eben andere Nachteile bei if-Orgien. Man hat uU pagefaults bei den Zugriff auf die vergleichswerte. Es ist einfach nicht moeglich zu sagen ob das eine oder andere schneller ist.
-
Ok, ok... Um das ganze abzuschließen. Ich programmier erstmal so sauber wie möglich und schön objektorientiert + polymorph. Dann schau ich später, was man rausholen kann...
Grüße
Sören