 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Jan Boehme Guest
|
Posted: Mon Oct 25, 2004 2:32 pm Post subject: Virtuelle Funktionen & Performance |
|
|
Hallo!
Ich habe nach dem Konsum mehrer C++ -Bücher den Eindruck, man solle an
Stellen, wo Ausführungsgeschwindigkeit bedeutend ist, auf virtuelle
Funktionen verzichten. Auf meinem Schreibtisch liegt nun ein Fall ,
für dessen elegante Lösung sich Polymorphie anbietet, jedoch schnelle
Ausführung unerlässlich ist.
Die jeweilige Methode soll 200-2000000 mal hintereinander aufgerufen
werden. Darin werden Daten speziell aufgearbeitet und liefern eine
Ergebnisstruktur zurück.
Meine Frage ist nun, ob nur die Ausführungszeit des ersten
Methodenaufrufs eines Sets durch den internen RTTypecheck negativ
beeinflusst wird, oder jeder Aufruf langsamer ist?
Stellt sich bei modernen Compilern diese Frage überhaupt noch?
Vielen Dank.
Freundliche Grüße,
Jan.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Karl Heinz Buchegger Guest
|
Posted: Mon Oct 25, 2004 3:58 pm Post subject: Re: Virtuelle Funktionen & Performance |
|
|
Jan Boehme wrote:
| Quote: |
Hallo!
Ich habe nach dem Konsum mehrer C++ -Bücher den Eindruck, man solle an
Stellen, wo Ausführungsgeschwindigkeit bedeutend ist, auf virtuelle
Funktionen verzichten. Auf meinem Schreibtisch liegt nun ein Fall ,
für dessen elegante Lösung sich Polymorphie anbietet, jedoch schnelle
Ausführung unerlässlich ist.
Die jeweilige Methode soll 200-2000000 mal hintereinander aufgerufen
werden. Darin werden Daten speziell aufgearbeitet und liefern eine
Ergebnisstruktur zurück.
Meine Frage ist nun, ob nur die Ausführungszeit des ersten
Methodenaufrufs eines Sets durch den internen RTTypecheck negativ
beeinflusst wird, oder jeder Aufruf langsamer ist?
Stellt sich bei modernen Compilern diese Frage überhaupt noch?
|
Falsche Frage.
Die Frage muss lauten:
Brauche ich Polymorphie, oder kann ich das Problem auch anders loesen.
Wenn Du Polymorphie brauchst, dann ist das was dir der Compiler mit
virtuellen Funktionen anbietet, mit ziemlicher Sicherheit das schnellste
was Du kriegen kannst.
Im uebrigen:
Bei einem virtuellen Funktion call wird zur Laufzeit gar nichts geprueft.
Im Regelfall handelt es sich um eine zusatzliche Pointerdereferenzierung
'unter der Tuchent' und das wars. Fuer sich alleine betrachtet ist der
Aufruf einer virtuellen Funktion daher natuerlich langsamer als ein
normaler Aufruf. Sobald Du allerdings in der Funktion ein bischen Action
hast, ist die zusaetzliche Zeit praktisch vernachlaessigbar.
Die wirkliche Frage lautet aber immer noch:
Welche Alternativen hast Du zur Polymorphie? In dem Moment wo Du einen
virtuellen Aufruf durch eine selbstverwaltete Typkennung und ein paar
'if' oder 'case' ersetzen willst, hast Du praktisch schon verloren. Der
virtuelle Aufruf ist schneller (Im Zweifelsfall: Testprogram schreiben
und Zeit messen)
--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Jan Boehme Guest
|
Posted: Mon Oct 25, 2004 5:02 pm Post subject: Re: Virtuelle Funktionen & Performance |
|
|
Hallo!
Karl Heinz Buchegger wrote:
| Quote: | Die wirkliche Frage lautet aber immer noch:
Welche Alternativen hast Du zur Polymorphie? In dem Moment wo Du einen
virtuellen Aufruf durch eine selbstverwaltete Typkennung und ein paar
'if' oder 'case' ersetzen willst, hast Du praktisch schon verloren. Der
virtuelle Aufruf ist schneller (Im Zweifelsfall: Testprogram schreiben
und Zeit messen)
|
Ich habe die Alternative bereits umgesetzt und fühle mich, als hätte ich
ein Monster erschaffen.
Es ist eine Klasse bei der Funktionensets die Arbeit übernehmen. Es gibt
eine einheitliche Schnittstelle, die das Set nach außen darstellt.
Intern gibt es so viele Sets, wie es Klassen geben würde: also für jede
spezielle Aufgabe ein Set von Funktionen. Bei der Konstruktion der
Klasse wird mittels der übergebenen Parameter ermittelt, welches Set zu
benutzen ist. Daraufhin werden die Memberfunktionspointer, die von den
Schnittstellenmethoden aufgerufen werden, "eingehangen".
Es gibt keine weitere Verzweigung, alles wird bei der Konstruktion
aufgelöst. Bis zu einem erneuten Init, das in der Praxis nicht vorkommt,
arbeiten die selben Funktionen bis ans Lebensende der Instanz.
Zweifelsohne ist das schnell, jedoch alles andere als hübsch.
Freundliche Grüße,
Jan.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Stefan Reuther Guest
|
Posted: Mon Oct 25, 2004 6:39 pm Post subject: Re: Virtuelle Funktionen & Performance |
|
|
Jan Boehme wrote:
| Quote: | Meine Frage ist nun, ob nur die Ausführungszeit des ersten
Methodenaufrufs eines Sets durch den internen RTTypecheck negativ
beeinflusst wird, oder jeder Aufruf langsamer ist?
|
Es gibt keinen "RTTypecheck", sondern es wird einfach ein Pointer
dereferenziert. Üblicherweise ist das etwas, das man in C als
mein_objekt.vtbl->meine_funktion(&mein_objekt, parameter);
aufschreiben würde.
| Quote: | Stellt sich bei modernen Compilern diese Frage überhaupt noch?
|
s/Compilern/Prozessoren/
Man kann diese Frage nicht beantworten, ohne ein konkretes Codestück zu
messen, und ohne einen konkreten Prozessor zu kennen.
Die Theorie sagt, dass virtuelle Aufrufe langsamer sind, da die
Funktionsadresse aus dem Speicher geladen werden muss und Speicher
langsam ist. In der Praxis gibt es aber auch Architekturen, in denen die
Aufrufsequenz für virtuelle Funktionen gleich lang oder gar kürzer als
die "normale" Aufrufsequenz ist. Ich hab auch schon Fälle gehabt, wo
eine virtuelle Funktion messbar schneller war als eine (geinlinete!)
direkt aufgerufene Getter-Funktion. Auf einem handelsüblichen x86.
Vermutlich einfach Cache-Effekte.
Wenn du durch virtuelle Aufrufe viel Zeit verlierst, solltest du darüber
nachdenken, Templates zu verwenden. Also statt
class framebuffer {
virtual void put_pixel(int x, int y) = 0;
};
class eight_bit_framebuffer : public framebuffer {
char* p; int wi;
void put_pixel(int x, int y)
{ p[wi*y+x] = 1; }
};
void fill(framebuffer& fb, ...);
eben
class eight_bit_framebuffer {
char* p; int wi;
void put_pixel(int x, int y)
{ p[wi*y+x] = 1; }
};
template<typename Traits>
void fill(...);
Das bringt ebenfalls messbar Gewinn.
Stefan
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Marcel Müller Guest
|
Posted: Mon Oct 25, 2004 6:59 pm Post subject: Re: Virtuelle Funktionen & Performance |
|
|
Karl Heinz Buchegger wrote:
| Quote: | Jan Boehme wrote:
Meine Frage ist nun, ob nur die Ausführungszeit des ersten
Methodenaufrufs eines Sets durch den internen RTTypecheck negativ
beeinflusst wird, oder jeder Aufruf langsamer ist?
Stellt sich bei modernen Compilern diese Frage überhaupt noch?
|
RTT-Checks gibt es typischerweise keine.
| Quote: | Falsche Frage.
Die Frage muss lauten:
Brauche ich Polymorphie, oder kann ich das Problem auch anders loesen.
Wenn Du Polymorphie brauchst, dann ist das was dir der Compiler mit
virtuellen Funktionen anbietet, mit ziemlicher Sicherheit das schnellste
was Du kriegen kannst.
|
Soweit die Theorie.
In der Praxis reagieren gerade Intel-CPUs etwas allergisch auf virtuelle
Funktionen. Es geht bei jedem V-Table-Call fast eine komplette
Execution-Pipeline-Tiefe verloren. Und diese ist bei Intel
bekanntermaßen tiefer als z.B. bei AMD.
Also bei einem V-Table-Call kommt sowas in der Art raus:
JMP [EAX]
Verwendet man hingegen if-then-else-Konstrukte, wird es eher sowas:
CMP ...
Jxx label
Der letztere Fall wird von der Branch-Prediction-Unit mehr oder minder
effektiv erfaßt, der erstere nicht.
Kurzum, eine geschickte Implementierung mit if-then-else (binärer Baum)
_kann_ bei wenigen Alternativen schon mal 10 bis 15 Taktzyklen schneller
sein. Bei 2 Mio. Calls kann sich das selbst auf modernen CPUs zu einigen
Sekunden addieren.
Im Übrigen gilt das auch für Funktionen-Pointer. Virtuelle
Funktionsaufrufe sind nämlich faktisch Dereferenzierungen von
Funktions-Pointern. Ausnahme: myclass::mymemberfunction(). In diesem
Fall wird die Sache natürlich schon zur Compilezeit aufgelöst.
Das ganze hat natürlich nur solange Relevanz, wie die betreffende
Funktion nicht selbst "eine halbe Ewigkeit" (also deutlich länger)
braucht. Also ich sage mal: in der Regel ist es kein Problem.
Kritisch wird die Sache aber, falls es ein ganzer Stall voller virtuelle
Funktionen ist (also ein Interface), die sich auch noch regelmäßig
gegenseitig aufrufen. In diesem Fall fallen immer wieder virtuelle
Funktionsaufrufe an, obgleich das Objekt ja immer das gleiche bleibt.
Das kann man optimieren, indem man innerhalb der Überladenen Funktionen
die weiteren Aufrufe per myclass:: explizit Funktionen der eigenen
Klasse aufruft. Eventuelle weitere Überladungen wären damit natürlich
wirkungslos. Aber das ist möglicherweise auch gar nicht erforderlich.
Sprachen wie Java oder C# haben für diesen Zweck das Schlüsselwort final
bzw. sealed, dann macht der Compiler das automatisch.
Das funktioniert natürlich nicht, wenn ein Teil der Implementation in
der Basisklasse liegt und darin pure Funktionen aufgerufen werden. In
diesen Fall sollte man, wenn es eben Zeitkritisch ist, den Code
kopieren, und vollständige Interfaceimplementationen in einer Klasse
verwenden.
Nicht zu unterschätzender Nebeneffekt der myclass::-Methode ist, daß der
Compiler zusätzlich die Chance bekommt einfache Funktionen per Automatic
Function Inline zu expandieren und damit den gesamten CALL/RETURN Zyklus
spart. Das ist bei virtuellen Funktionsaufrufen prinzipiell nicht möglich.
Marcel
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Bernd Nawothnig Guest
|
Posted: Tue Oct 26, 2004 7:04 am Post subject: Re: Virtuelle Funktionen & Performance |
|
|
Hi Jan,
On Mon, 25 Oct 2004, Jan Boehme <aiscape (AT) hotmail (DOT) com> wrote:
| Quote: | Ich habe nach dem Konsum mehrer C++ -Bücher den Eindruck, man solle an
Stellen, wo Ausführungsgeschwindigkeit bedeutend ist, auf virtuelle
Funktionen verzichten. Auf meinem Schreibtisch liegt nun ein Fall ,
für dessen elegante Lösung sich Polymorphie anbietet, jedoch schnelle
Ausführung unerlässlich ist.
Die jeweilige Methode soll 200-2000000 mal hintereinander aufgerufen
werden. Darin werden Daten speziell aufgearbeitet und liefern eine
Ergebnisstruktur zurück.
Meine Frage ist nun, ob nur die Ausführungszeit des ersten
Methodenaufrufs eines Sets durch den internen RTTypecheck negativ
beeinflusst wird, oder jeder Aufruf langsamer ist?
Stellt sich bei modernen Compilern diese Frage überhaupt noch?
|
Die virtuelle Methode wirst Du kaum als bremsend empfinden, sowie sie
nennenswerte Nutzlast trägt. Die Alternativen und ihre "Schönheit",
die sich an momentaner Hardware orientiert, kannst Du ja im Thread
ebenfalls nachlesen. Mich grauselts, wenn ich sowas lese.
Bernd
--
Those who desire to give up freedom in order to gain security,
will not have, nor do they deserve, either one. [T. Jefferson
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Bernd Nawothnig Guest
|
Posted: Tue Oct 26, 2004 7:05 am Post subject: Re: Virtuelle Funktionen & Performance |
|
|
Hi Jan,
On Mon, 25 Oct 2004, Jan Boehme <aiscape (AT) hotmail (DOT) com> wrote:
| Quote: | Zweifelsohne ist das schnell, jedoch alles andere als hübsch.
|
Ist es auch messbar schnell*er* und wenn ja, wieviel?
Bernd
--
Those who desire to give up freedom in order to gain security,
will not have, nor do they deserve, either one. [T. Jefferson
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Michael Schuerig Guest
|
Posted: Tue Oct 26, 2004 8:59 am Post subject: Re: Virtuelle Funktionen & Performance |
|
|
Jan Boehme wrote:
| Quote: | Es ist eine Klasse bei der Funktionensets die Arbeit übernehmen. Es
gibt eine einheitliche Schnittstelle, die das Set nach außen
darstellt. Intern gibt es so viele Sets, wie es Klassen geben würde:
also für jede spezielle Aufgabe ein Set von Funktionen. Bei der
Konstruktion der Klasse wird mittels der übergebenen Parameter
ermittelt, welches Set zu benutzen ist. Daraufhin werden die
Memberfunktionspointer, die von den Schnittstellenmethoden aufgerufen
werden, "eingehangen". Es gibt keine weitere Verzweigung, alles wird
bei der Konstruktion aufgelöst.
|
Da es überraschenderweise noch niemand geschrieben hat: Du hast offenbar
den Aufrufmechanismus, wie ihn C++ üblicherweise für virtuelle
Funktionen verwendet, nachgebaut. Vermutlich nicht so gut, wie der
Hersteller deines Compilers das ohnehin schon getan hat.
Michael
--
Michael Schuerig Cold silence has a tendency
mailto:michael (AT) schuerig (DOT) de To atrophy any sense of compassion
http://www.schuerig.de/michael/ --Tool, Schism
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Olaf Krzikalla Guest
|
Posted: Tue Oct 26, 2004 9:56 am Post subject: Re: Virtuelle Funktionen & Performance |
|
|
Hi,
Jan Boehme schrieb:
| Quote: | Auf meinem Schreibtisch liegt nun ein Fall ,
für dessen elegante Lösung sich Polymorphie anbietet, jedoch schnelle
Ausführung unerlässlich ist.
Diese Forderungen sind in Deinem Fall _wahrscheinlich_ ohne Probleme |
vereinbar (zumindest lese ich das zwischen den Zeilen in Deinen Posts -
Du könntest ja auch konkreter werden). Polymorphie kann statisch oder
dynamisch sein. In Deinem Fall wird wohl statische Polymorphie
ausreichend sein. Damit ist also die schon vorgeschlagene Verwendung von
Templates angezeigt.
MfG
Olaf Krzikalla
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Chris Theis Guest
|
Posted: Tue Oct 26, 2004 11:24 am Post subject: Re: Virtuelle Funktionen & Performance |
|
|
"Karl Heinz Buchegger" <kbuchegg (AT) gascad (DOT) at> wrote
| Quote: | Jan Boehme wrote:
Hallo!
Ich habe nach dem Konsum mehrer C++ -Bücher den Eindruck, man solle an
Stellen, wo Ausführungsgeschwindigkeit bedeutend ist, auf virtuelle
Funktionen verzichten. Auf meinem Schreibtisch liegt nun ein Fall ,
für dessen elegante Lösung sich Polymorphie anbietet, jedoch schnelle
Ausführung unerlässlich ist.
Die jeweilige Methode soll 200-2000000 mal hintereinander aufgerufen
werden. Darin werden Daten speziell aufgearbeitet und liefern eine
Ergebnisstruktur zurück.
Meine Frage ist nun, ob nur die Ausführungszeit des ersten
Methodenaufrufs eines Sets durch den internen RTTypecheck negativ
beeinflusst wird, oder jeder Aufruf langsamer ist?
Stellt sich bei modernen Compilern diese Frage überhaupt noch?
Falsche Frage.
Die Frage muss lauten:
Brauche ich Polymorphie, oder kann ich das Problem auch anders loesen.
Wenn Du Polymorphie brauchst, dann ist das was dir der Compiler mit
virtuellen Funktionen anbietet, mit ziemlicher Sicherheit das schnellste
was Du kriegen kannst.
[SNIP] |
An den OP:
Eine Loesung fuer solch ein moegliches Performanceproblem ist dynamischen
durch statischen Polymorphismus zu ersetzen. Vorher aber noch ein kurzer
Exkurs zu den virtuellen Funktionen & modernen Compilern. Prinzipiell wird
vom Compiler verlangt, dass der Polymorphismus richtig funktionieren muss,
jedoch kann er im Falle von DataFlow Analysis in manchen Faellen den VTABLE
umgehen und die z.B. inline und virtual deklarierte Funktion wirklich
expandieren. Dies muss jedoch nicht notwendigerweise geschehen und ist sehr
von deinem Code abhaengig, wie auch die moegliche Laufzeitersparniss. Im
schlechtesten Fall steigst du mit der "normalen" VTABLE Version aus.
Nun zum statischen Polymorphismus: Ein klassisches Beispiel ist z.B. der
Zugriff Matrizen:
class Matrix {
public:
virtual double operator()(int i, int j) = 0;
};
class SymmetricMatrix : public Matrix {
public:
virtual double operator()(int i, int j);
};
Eine Moeglichkeit diesen virtual function call zu sparen sieht
folgendermassen aus:
class SymmetricMatrix : public Matrix<SymmetricMatrix>{
double operator()(int i, int j);
};
template<class TDerived>
class Matrix {
public:
TDerived& GetDerived() {
return static_cast<TDerived&>(*this);
}
double operator()(int i, int j) {
// delegate to static child impl.
return GetDerived()(i,j);
}
};
Ob dies nun wirklich notwendig und vorteilhaft ist, haengt jedoch wie gesagt
von deiner Problemstellung und dem Code in der virtuellen Funktion ab.
mfG
Chris
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Marcel Müller Guest
|
Posted: Tue Oct 26, 2004 1:13 pm Post subject: Re: Virtuelle Funktionen & Performance |
|
|
Oliver S. wrote:
| Quote: | Kurzum, eine geschickte Implementierung mit if-then-else (binärer
Baum) _kann_ bei wenigen Alternativen schon mal 10 bis 15 Taktzyklen
schneller sein.
Das kann man so pauschal nicht sagen, denn das hängt auch davon ab,
wieviel Varianten über mehrere ifs oder einen switch-Block dispatcht
werden müssen.
|
Das ist klar. Das Skaliert günsigstenfalls mit log n.
| Quote: | Der switch-Block wird dann unter umständen wiederum
durch eine Sprungtablelle realisiert, und die hat ungefähr die glei-
che Effizienz wie ein VTable-Sprung.
|
Korrekt. Kurzum, es lohnt nur bei sehr wenigen Alternativen.
Schneller geht es nur noch mit selbstmodifizierendem Code, und das auch
nicht auf jeder Infrastruktur... - und vor allem nicht mit C++.
| Quote: | Bei 2 Mio. Calls kann sich das selbst auf modernen
CPUs zu einigen Sekunden addieren.
Hä? Zwei Millionen mal 15 Takte macht doch noch lange keine Sekunden.
|
OOps. Habe irgendwie mit 2 Mrd. Calls gerechnet. Bei 2 Mio ist es in der
tat Banane.
Marcel
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Dietmar Kuehl Guest
|
Posted: Tue Oct 26, 2004 1:27 pm Post subject: Re: Virtuelle Funktionen & Performance |
|
|
Jan Boehme <aiscape (AT) hotmail (DOT) com> wrote:
| Quote: | Es ist eine Klasse bei der Funktionensets die Arbeit übernehmen. Es gibt
eine einheitliche Schnittstelle, die das Set nach außen darstellt.
Intern gibt es so viele Sets, wie es Klassen geben würde: also für jede
spezielle Aufgabe ein Set von Funktionen. Bei der Konstruktion der
Klasse wird mittels der übergebenen Parameter ermittelt, welches Set zu
benutzen ist. Daraufhin werden die Memberfunktionspointer, die von den
Schnittstellenmethoden aufgerufen werden, "eingehangen".
|
Damit hast Du nur leider nichts gegenüber virtuellen Funktionen gewonnen,
eher im Gegenteil verloren: virtuelle Funktionen werden üblicherweise
über Funktionszeiger aufgerufen, also genau so, wie Du es nachgebildet
hast. Allerdings ist der tatsächlich für virtuelle Funktionen verwendete
Mechanismus in der Regel etwas geschickter und tricks noch einige Sachen
zurecht.
Wollte man was "besseres" machen, dann verwendet man üblicherweise
statische statt dynamischer Polymorphie, dh. Templates anstatt virtuellen
Funktionen. Der wesentliche Unterschied ist, dass Templates zur
Compilierzeit aufgelöst werden. Wenn erst zur Laufzeit entscheiden werden
kann, welche Konfiguration gebraucht wird, dann erzeugt man halt mehrere
und wählt am Anfang des Laufs die entsprechende aus.
--
<mailto:dietmar_kuehl (AT) yahoo (DOT) com> <http://www.dietmar-kuehl.de/>
<http://www.contendix.com> - Software Development & Consulting
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Jan Boehme Guest
|
Posted: Tue Oct 26, 2004 3:17 pm Post subject: Re: Virtuelle Funktionen & Performance |
|
|
Hallo Chris!
Vielen Dank an Dich und alle anderen Threadteilnehmer für die
aufschlussreichen Ausführungen.
Grüße, Jan.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Ullrich Praetz Guest
|
Posted: Tue Oct 26, 2004 5:10 pm Post subject: Re: Virtuelle Funktionen & Performance |
|
|
| Quote: | Kurzum, eine geschickte Implementierung mit if-then-else (binärer
Baum) _kann_ bei wenigen Alternativen schon mal 10 bis 15 Taktzyklen
schneller sein.
Das kann man so pauschal nicht sagen, denn das hängt auch davon ab,
wieviel Varianten über mehrere ifs oder einen switch-Block dispatcht
werden müssen.
Das ist klar. Das Skaliert günsigstenfalls mit log n.
|
Was meinst Du mit log n. Die Laufzeitkomplexität auch von sehr vielen if's
oder switch'es in einem Block ist konstant => O(1). Jedenfalls solange
keine Schleife benutzt wird. Aber dafür sind andere Statements notwendig
wie while, for oder goto.
Gruß Ulli
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Tue Oct 26, 2004 7:08 pm Post subject: Re: Virtuelle Funktionen & Performance |
|
|
Karl Heinz Buchegger wrote:
| Quote: | Jan Boehme wrote:
Hallo!
Ich habe nach dem Konsum mehrer C++ -Bücher den Eindruck, man solle an
Stellen, wo Ausführungsgeschwindigkeit bedeutend ist, auf virtuelle
Funktionen verzichten. Auf meinem Schreibtisch liegt nun ein Fall ,
für dessen elegante Lösung sich Polymorphie anbietet, jedoch schnelle
Ausführung unerlässlich ist.
Die jeweilige Methode soll 200-2000000 mal hintereinander aufgerufen
werden. Darin werden Daten speziell aufgearbeitet und liefern eine
Ergebnisstruktur zurück.
Meine Frage ist nun, ob nur die Ausführungszeit des ersten
Methodenaufrufs eines Sets durch den internen RTTypecheck negativ
beeinflusst wird, oder jeder Aufruf langsamer ist?
Stellt sich bei modernen Compilern diese Frage überhaupt noch?
Falsche Frage.
Die Frage muss lauten:
Brauche ich Polymorphie, oder kann ich das Problem auch anders loesen.
Wenn Du Polymorphie brauchst, dann ist das was dir der Compiler mit
virtuellen Funktionen anbietet, mit ziemlicher Sicherheit das schnellste
was Du kriegen kannst.
Im uebrigen:
Bei einem virtuellen Funktion call wird zur Laufzeit gar nichts geprueft.
Im Regelfall handelt es sich um eine zusatzliche Pointerdereferenzierung
'unter der Tuchent' und das wars.
|
Im Prinzip ist es keine einzelne Dereferenzierung, sondern eine dreifache.
Zuerst wird - evtl. unter Additon eines passenden Offset - der Objektzeiger
dereferenziert, um an den vtable-Zeiger zu kommen. Dieser muß nun -
ebenfalls unter Addtion des passenden Offset - dereferenziert werden, um an
den zur virtuellen Funktion gehörenden Eintrag zu kommen. Der ist nun der
Funktionszeiger, der dereferenziert wird, um die Funktion aufzurufen.
| Quote: | Fuer sich alleine betrachtet ist der
Aufruf einer virtuellen Funktion daher natuerlich langsamer als ein
normaler Aufruf.
|
Es sei aber noch angemerkt, daß Funktionen bei nicht-polymorphem Aufruf auch
geinlined werden können, wenn man seinen Code passend schreibt.
| Quote: | (Im Zweifelsfall: Testprogram schreiben und Zeit messen)
|
Das ist immer eine gute Idee, wenn's auf Geschwindigkeit ankommt. Es kommt
dabei durchaus manchmal mal was raus, was man nicht erwartet hat.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|