Perfomance
-
Hi,
wie kann man in C++ die Performance verbessern?
-
- Assembler
- besserer Algorithmus
- Compileroptimierungencya
liquid
-
Indem man...
...die gewählten Algorithmen überprüft und gegebenenfalls durch schnellere ersetzt.
...die gewählten Datenstrukturen überprüft und gegebenenfalls durch passendere ersetzt.
...Gegebenheiten des darunterliegenden Systems (zum Beispiel das Vorhandensein eines Caches) beachtet und seinen Code so schreibt, dass sich diese Gegebenheiten nicht mit dem Code "beißen".
...sauberen und lesbaren Code schreibt, denn sauberer, lesbarer Code ist oft auch schnell.
...andere Compiler und Compileroptionen ausprobiert und testet, ob diese vielleicht noch etwas mehr Performance bringen.
...Profiler nutzt und so herausfindet, wo Performance-Flaschenhälse liegen und welche Teile des Codes oft durchlaufen werden. Die man dann genauer betrachten kann und vielleicht weiter optimieren kann.
-
- unnötige Funktionsaufrufe wie Konstruktoren vermeiden
- kleine Funktionen inline deklarieren
- Wenn sich eine Berechnung in einer for-Schleife ständig wiederholt muss man diese Berechnung vorher machen ( zB zugriff auf verschachtelte Strukturen mit mehreren Zeigern )
-
die for schleifen entfernen die nur bis 1000000 zählen und sonst nichts machen.
rapso->greets();
-
Mittels Metaprogrammierung soe viel wie möglich zur Compilezeit berechnen.
Manchmal hilft Mojo (siehe Artikel im CUJ)
Es gibt so viel, was man tun kann.
-
0x00000001 schrieb:
- Wenn sich eine Berechnung in einer for-Schleife ständig wiederholt muss man diese Berechnung vorher machen ( zB zugriff auf verschachtelte Strukturen mit mehreren Zeigern )
die for schleifen entfernen die nur bis 1000000 zählen und sonst nichts machen.
Ich vermute fast, das bringt bei heutigen Compilern nichts mehr, weil die das selbst können!
-
@Grogor
Ich glaube rapso hat das etwas anders gemeint
-
PS: Inkremente und Dekremente (nennt man das so
) prefix anstatt postfix machen.
Also anstatt i++ ++i schreiben. Bringt zwar nicht viel, aber in der Summe kann es doch vielleicht was rausholen.
-
Tony Hoare schrieb:
Premature optimization is the root of all evil
du solltest lieber dein Programm schreiben und nach dem testen mit einem Profiler dir für einige Algorithmen/Wege neue Lösungen ausdenken. Der Rest bringt nichts und sorgt eher dafür, dass man dein Programm schlechter lesen kann/unportabel wird etc.
-
hmmm thx!!! aber is i++ nicht was anderes als ++i??? (von der reinfolge her)
außerdem progge ich mit VC++ und DirectX => Spiele!!!
-
VC und DX hat nix mit schlechtem Code zu tun, der unperformant ist
Und zwischen i++ und ++i ist ein unterschied.
++i wird sofort ausgeführt, keine Seiteneffekte
i++ erst später, und es treten Seiteneffekte auf, die Zeit kosten.Bei int ist es eigentlich Wurst ob ++i oder i++
Aber probier mal das beim Iterator oder so zu machen. Du wirst dich wundern.
-
@bobba
Das Umändern von i++ auf ++i solltest du natürlich nur machen, wenn es den Programmablauf nicht verändert. Wenn es wichtig ist, dass die Variable erst nach der Auswertung inkrementiert bzw. dekrementiert wird, dann musst du das natürlich lassen.
-
Wenn du ein komplexes Objekt mit einer Funktion verarbeitest und anschliessend auch wieder das selbe Objekt - oder zumindest dessen Inhalt - im selben Ausgangs-Objekt speichern willst, dann arbeite mit Pointern.
(edit)
Ach ja, was ist denn jetzt der genaue Unterschied zwischen ++i und i++ ?
-
-
Cpp_Junky schrieb:
Wenn du ein komplexes Objekt mit einer Funktion verarbeitest und anschliessend auch wieder das selbe Objekt - oder zumindest dessen Inhalt - im selben Ausgangs-Objekt speichern willst, dann arbeite mit Pointern.
(edit)
Ach ja, was ist denn jetzt der genaue Unterschied zwischen ++i und i++ ?Der Unterschied ist folgender:
a = i++; // hier wird a i zugewiesen, anschließend wird i um 1 erhöht.
a = ++i; // hier wird i um eins erhöht, anschließend wird a i zugewiesen.Warum sollte man in deinem Beispiel mit Pointern arbeiten? Was spricht gegen Referenzen?
-
@junky
Einfach ausgedrückt:
Bei ++i wird die Variable einfach erhöht
Bei i++ muss noch eine Kopie der Variablen angefertigt werden, die dann ausgewertet werden kann.
-
Referenz anstatt Pointer ?
Das meinte ich damit! Hab mich vielleicht nicht korrekt ausgedrückt.Also ich meinte sowas:
DeinObjekt = MachWas(DeinObjekt)
...umbasteln in dies hier:
MachWas(&DeinObjekt)
-
@junky
Das ist ein Zeiger. Bei ner Referenz würde es so aussehen (vom Aufruf her):MachWas(DeinObjekt);
Bei der Deklaration müsstest du aber anstatt dem * ein & angeben. In der Funktion kannst du den Parameter dann übrigens auch ganz normal ansprechen, ohne *
-
AJ schrieb:
@junky
Das ist ein Zeiger. Bei ner Referenz würde es so aussehen (vom Aufruf her):MachWas(DeinObjekt);
Bei der Deklaration müsstest du aber anstatt dem * ein & angeben. In der Funktion kannst du den Parameter dann übrigens auch ganz normal ansprechen, ohne *
Das, was Junky geschrieben hat, ist vollkommen richtig gewesen.