C++Code optimieren
-
Was haltet ihr von http://www.tantalon.com/pete/cppopt/main.htm ? Gibts da noch weitere Tippssammluingen?
-
Meine Meinung zu dem Verlinkten: Sind nur triviale 0815-Tipps.
-
blllllllllll schrieb:
Meine Meinung zu dem Verlinkten: Sind nur triviale 0815-Tipps.
Was für Tipps willst du sonst geben, außer allgemeinen? Für tolle konkrete Tipps, brauchst du konkreten Code und dann interessiert es nur die eine Person, die diesen Code hat.
-
Die Tipps sind großteils Müll in der heutigen Zeit...
-
"Consider two-phase construction"? Da kommt einem ja das Schaudern. Ansonsten ist einiges mit der Einführung von Move-Semantik hinfällig, und anderes war es schon länger durch Weiterentwicklungen in der Compilertechnik. Ich denke da insbesondere an den Punkt "Limit exception handling", was man zumindest aus Geschwindigkeitsgründen schön sein lassen sollte.
Die Abschnitte "C++ Optimizations You Can Do "As You Go"" und "Final Optimizations" dagegen sehen nach wie vor sinnvoll aus. Was mir komisch aufstößt, ist, dass Cache-Lokalität mit keinem Wort erwähnt wird. Erfahrungsgemäß ist das (neben Vektorisierung, wenn man sich die Arbeit macht) das, was am meisten bringt.
Siehe dazu auch http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/Keynote-Bjarne-Stroustrup-Cpp11-Style (speziell ab 44:00). Ich gehe oft noch einen Schritt weiter und halte meinen Kram auf dem Stack, aber ich muss ja auch mit stark nebenläufigen Szenarien und Heap-Contention rechnen.
-
Dazu auch http://www.virtual-maxim.de/cache-optimierung-zeitliche-und-raeumliche-lokalitaet/ http://www.inf.fu-berlin.de/inst/ag-bio-expired/FILES/ROOT/Teaching/Lectures/SS04/hardcore_cpp/CPP-Hardcore_4.pdf
Danke dafür! Das war mir ganz neu.
Was für Tipps sind denn noch in dem Stroustrup-Video? Anschauen dauert mir zu lange.
-
Bei dem Array-Beispiel von Cachelokalität: Machen das die Compiler mittlerweile selbst?
-
blllllllllll schrieb:
Dazu auch http://www.virtual-maxim.de/cache-optimierung-zeitliche-und-raeumliche-lokalitaet/ http://www.inf.fu-berlin.de/inst/ag-bio-expired/FILES/ROOT/Teaching/Lectures/SS04/hardcore_cpp/CPP-Hardcore_4.pdf
Danke dafür! Das war mir ganz neu.
Was für Tipps sind denn noch in dem Stroustrup-Video? Anschauen dauert mir zu lange.
Hab gerade die Slides entdeckt: http://ecn.channel9.msdn.com/events/GoingNative12/GN12Cpp11Style.pdf
-
Laut der Tabelle im Anhang auf der Seite (http://www.tantalon.com/pete/cppopt/appendix.htm#AppendixB) sind einige operationen (präinkrement, division, modulo, bitwise NOT und >= operator) langsamer mit unsigned int's als mit signed int's.
Gibt es da irgend einen Grund für? Oder sind das die erwähnten 0,1 Messungenauigkeit?
-
blllllllllll schrieb:
Bei dem Array-Beispiel von Cachelokalität: Machen das die Compiler mittlerweile selbst?
Nein. Das ist eine Optimierung die sie - zumindest für floating-point - nicht durchführen dürfen. dank numerischer Ungenauigkeiten unterscheiden sich dann nämlich die Ergebnisse der beiden Versionen.
-
blllllllllll schrieb:
Bei dem Array-Beispiel von Cachelokalität: Machen das die Compiler mittlerweile selbst?
Nein, manuelles Nachbessern kann die Performance stark steigern.
-
Performance schrieb:
Laut der Tabelle im Anhang auf der Seite (http://www.tantalon.com/pete/cppopt/appendix.htm#AppendixB) sind einige operationen (präinkrement, division, modulo, bitwise NOT und >= operator) langsamer mit unsigned int's als mit signed int's.
Gibt es da irgend einen Grund für? Oder sind das die erwähnten 0,1 Messungenauigkeit?Ich vermute der Grund ist, das overflow beim signed int undefined ist (sogar explizit aus dem Grund, um optimierungen zu erlauben)
-
KMT schrieb:
Performance schrieb:
Laut der Tabelle im Anhang auf der Seite (http://www.tantalon.com/pete/cppopt/appendix.htm#AppendixB) sind einige operationen (präinkrement, division, modulo, bitwise NOT und >= operator) langsamer mit unsigned int's als mit signed int's.
Gibt es da irgend einen Grund für? Oder sind das die erwähnten 0,1 Messungenauigkeit?Ich vermute der Grund ist, das overflow beim signed int undefined ist (sogar explizit aus dem Grund, um optimierungen zu erlauben)
Nur macht vc6 davon keinen Gebrauch (ist bei diesen einfachen Operationen auch kaum möglich), und außerdem wurde ja gerade ohne Optimierung getestet.
Die gesamte Übersicht ist aus diesem Grunde von vornherein unsinnig und - schlimmer noch - irreführend.
Es findet (außer ggf. bei völlig unoptimierten Builds) keine 1:1 - Übersetzung von Sprachprimitiven in Maschinensprache statt. Solchen einfachen Operationen ohne Kontext Zeiten zuzuordnen ist sinnlos und Zeitverschwendung.
-
Ich habs mir zugegebenermaßen nicht weiter angeschaut. War auch eher Spekulation.
Warum diese Unterschiede dann auftreten, würde mich aber - selbst wenn es nur einen Spezialfall betrifft - dann auch interessieren.