Effizienz Regeln
-
Welche Regeln sollte man einhalten um in C++ ein schnelles Compilat zu erhalten?
Virtuelle Funktionene und Templates sind schon mal langsam aufgrund ihrer dynamischen Bindung.
B.
-
Premature optimization is the root of all evil.
-
@MFK: Woher weißt du, dass es sich um "premature optimization" handelt
. Klar, es ist leichter einen Spruch rauszuknallen den man mal irgendwo aufgeschnappt hat als eine Antwort zu geben.
-
Soweit ich weiss, werden Templates zur compilezeit für jeden Typ generiert -> also nichts dynamische Bindung.
Gruss Tobias
-
Georgius schrieb:
Welche Regeln sollte man einhalten um in C++ ein schnelles Compilat zu erhalten?
Vieles optimiert der Compiler schon selber. Klar, es gibt einige Sachen die man vermeiden (bzw. sich angewöhnen) sollte. Dazu zählen:
- preincrement wenn möglich anstatt postincrement.
- Variablen so lokal wie möglich halten etc.
- Konstruktorinitialisierungslisten verwenden.
- redundanten Code entfernen.
- ...Am allerbesten ist es aber wenn man seinen Code nochmal überdenkt. Manchmal helfen dabei auch einige mathematische Tricks, wie geometrische Summen und diverse andere Formeln die ein Problem effizienter lösen...
-
Welche Regeln sollte man einhalten um in C++ ein schnelles Compilat zu erhalten?
Virtuelle Funktionene und Templates sind schon mal langsam aufgrund ihrer dynamischen Bindung.
B.
Jemand der solch unqualifizierte Aussagen macht, sollte möglichst überhaupt nicht über Optimierung nachdenken. Lieber erstmal ein, zehn gute Bücher zum Thema lesen.
-
MaSTaH schrieb:
@MFK: Woher weißt du, dass es sich um "premature optimization" handelt
. Klar, es ist leichter einen Spruch rauszuknallen den man mal irgendwo aufgeschnappt hat als eine Antwort zu geben.
Ich glaube wirklich, dass meine Antwort eine war, die dem Fragenden weiterhilft. Wer sich generell über die Performance-Nachteile von virtuellen Funktionen Gedanken macht, ohne zu überprüfen, ob das im konkreten Fall wirklich etwas bringt und der Flaschenhals nicht ganz woanders liegt, der optimiert in meinen Augen zu früh und wahrscheinlich auch an der falschen Stelle.
So etwas wie "Postinkrement nur da, wo es nötig ist" ist natürlich immer hilfreich, aber die Frage schien mir in eine andere Richtung abzuzielen. Und generell aus Performancegründen auf virtuelle Funktionen zu verzichten, halte ich für Quatsch.
IMHO sollte das Programm zuerst mal laufen, dann kann man an der Performance feilen.
-
Ich versteh nicht ganz, was das soll. Wenn ich virtuelle Methoden brauche, dann brauche ich sie, wenn nicht dann nicht. Ferig.
-
schnelles Compilat
siehe Herb Sutter, Exceptional C++, Addison-Wesley, 2000, Kap. 5, S. 119ff.
-
Erstmal sollte man das Programm überhaupt soweit erstellen, dass es weitgehend fehlerfrei läuft. 1% des Codes brauchen 99% der Rechenzeit.
Diese Codeabschnitte muss man ausfindig machen, es bringt NICHTS, einfach irgendwas zu optimieren, man muss den Flaschenhals suchen.
Und bevor man auch nur ansatzweise über so Feinheiten wie pre-inkrement, virtuelle Funktionen, inline, usw. nachdenkt, sollte man sich erstmal überlegen, ob man nicht einen besseren Algorithmus findet.
-
Im Prinzip hast Du recht... okay, die 1% zu 99% Regel ist vielleicht etwas krass, normalerweise heißt es eher 10-90.
Und das Präinkrement statt Postinkrement kostet garnichts an Aufwand für den Programmierer, außer einer kurzen Umgewöhnungszeit. Das kann man sich schon angewöhnen. Man muß ja nicht, bloß weil vorzeitige Optimierung schlecht ist absichtlich Konstrukte verwenden, die sich möglicherweise negativ auf die Performanz auswirken. Den restlichen Punkten Deiner Ausführung kann ich aber uneingeschränkt zustimmen.
-
Am wichtigsten ist einfacher Code. Ein Problem in viele kleine Teilprobleme aufteilen und dann sinnvoll zusammensetzen. So entsteht wiederverwendbarer einfacher Code.
-
@MaSTaH Kommt da die RWTH Aachen mit der Bindung an die Industrie (Realität) durch
Deine Postings enthalten aus meiner Sicht die beiden wichtigsten Punkte für Optimierung.
1. Klares und effizientes Design durch Optimierung der Algorithmik.
2. Klare Zergliedrung des Problems in überschaubare orthogonale Teilprobleme, das führt nebenbei zu einer guten der Wartbarkeit. An solchen Programmteilen kann man dann auch an die Bottlenecks zu identifiziern und zu eliminieren.Und wenn man ein Problem so zerlegt ist, kann man nötigenfalls für die Geschwindkeitsoptimierung gezielt Teilstücke zusammensetzen.
-
Jetzt ist ja einiges gefallen.
Meine Fragestellung lautete genaugenommen welchen Programmierstil man nachgehen sollte. z. B.: Post- statt Preincrement. Einfach Kleinigkeiten, die es einem C++ Compiler ermöglicht einen etwas schnelleren Code zu generieren.
Sehr viele kleine Sachen tragen ja auch zum ganzen bei.
Dass es jetzt in erster Linie auf den eigentlichen Algorithmus ankommt weis ich schon. Nur wenn man schon mal einen guten Algo entworfen hat ist ein kleiner Geschwindigkeitsvorteil der durch guten Programmierstil erreicht wird sicherlich von Vorteil welcher eigentlich keinen Mehraufwand darstellen sollte.
Danke.