Tipps zum Beschleunigen des Programmablaufs in C++

Hallo!

Ich selber kann zwar in C++ einigermaßen ordentlich programmieren, jedoch fehlt mir das Wissen um Tipps und Tricks, mit denen ich es schaffen kann, Programme schneller ablaufen zu lassen. (das leidige Problem mit der Speicherverwaltung habe ich mitlerweile auch einigermaßen im Griff :wink: )

Das einzige was mir bisher bekannt ist, daß Methodenaufrufe mehr Zeit kosten als Daten direkt selber zu setzen.

set(x,y,val)

kostet somit mehr Laufzeit als

data[x][y] = val

Ist es für Methoden besser nur Pointer zu übergeben oder macht es da keinen großen Unterschied?
Wie sieht es mit Klassenkonstruktren aus? Gibt es hier etwas besonderes zu beachten? Was ist vorteilhafter (Beispiel): eine eigene Klasse für das Speichern von 2 zusammegehörenden Werten zu definieren oder ein struct?
Wirken sich besonders viele (und eventuell unnötige) #includes auf die Laufzeit aus?
Was ist besser für die Laufzeit? Daten auf dem Stack zu speichern oder den Heap zu benutzen? Wie sieht es bei Objekten aus: besser auf den Stack oder auf

Gibt es sonst noch Tips und Tricks die man zu beachten hätte?

Besten Dank im voraus.

Grüße

Björn

Auch hallo.

Gibt es sonst noch Tips und Tricks die man zu beachten hätte?

Eine ganze Menge: ISBN 3827322979 Buch anschauen

HTH
mfg M.L.

Hallo B.

Das einzige was mir bisher bekannt ist, daß Methodenaufrufe
mehr Zeit kosten als Daten direkt selber zu setzen.

korrekt, aber führt meißt zu unübersichtlichem Code. Manche kleine Methoden kann man auch als ‚inline‘ deklarieren und damit den Compiler anweise, wenn möglich, den Code „aufzulösen“.

Ist es für Methoden besser nur Pointer zu übergeben oder macht
es da keinen großen Unterschied?

Kommt auf die Datengröße an. Eine Struktur reicht man ggf. besser mittels eines Pointers weiter, da sie sonst komplett umkopiert werden muss. Nicht immer ist das aber so gewünscht, eben weil man z.B. mit einer Kopie der Struktur arbeiten möchte.

Wie sieht es mit Klassenkonstruktren aus? Gibt es hier etwas
besonderes zu beachten? Was ist vorteilhafter (Beispiel): eine
eigene Klasse für das Speichern von 2 zusammegehörenden Werten
zu definieren oder ein struct?

Macht eigentlich keinen Unterschied - Eine Klasse ist (sehr) vereinfacht betrachtet auch nur ein struct.

Wirken sich besonders viele (und eventuell unnötige) #includes
auf die Laufzeit aus?

nein, #include ist eine Compiler-Anwesiung ein anderes File einzubinden.

Was ist besser für die Laufzeit? Daten auf dem Stack zu
speichern oder den Heap zu benutzen? Wie sieht es bei Objekten
aus: besser auf den Stack oder auf

Kommt darauf an … :wink:

Gibt es sonst noch Tips und Tricks die man zu beachten hätte?

Ja,

  • Gute Algorithmen verwenden.
  • für das Problem angemessen Datenstrukturen verwenden.
  • Schleifeninvarianzen vermeiden,
  • unnötiges Hin- und herkopieren von Speicher/Daten vermeiden.

Gruß Klaus

Hallo Björn

Das einzige was mir bisher bekannt ist, daß Methodenaufrufe
mehr Zeit kosten als Daten direkt selber zu setzen.

set(x,y,val)

kostet somit mehr Laufzeit als

data[x][y] = val

Das kann sein, muss aber nicht sein. Es kann
durchaus sein, dass der Compiler für set(…)
viel schnelleren Code erzeugen kann.

Ich würde bei massiven Berechnungen und
grossen Arrays wahrscheinlich immer eher
zu set(…) (mit {x,y} sukzessive in einem
linearen Array) tendieren, weil array[x][y]
für mich schon nach ‚cacheline-trashing‘ riecht.

Aber das kann man nicht pauschalisieren.

Ist es für Methoden besser nur Pointer zu übergeben
oder macht es da keinen großen Unterschied?

Im Gegensatz zu was? Zu Referenzen? Ist praktisch identisch.

Wie sieht es mit Klassenkonstruktren aus? Gibt es hier etwas
besonderes zu beachten? Was ist vorteilhafter (Beispiel): eine
eigene Klasse für das Speichern von 2 zusammegehörenden Werten
zu definieren oder ein struct?

Wenn die zusammengehörenden Werte ‚kohärent‘ sind, also
immer auch zusammen verwendet werden, dann ist es besser
eine Klasse/eine Struktur (egal) { int a; int b; } zu
nehmen, aus welcher man ein Array macht.

Wird immer je nur einer der Werte sukzessive verwendet,
it es besser, zwei getrennte Arrays zu nehmen.

Wirken sich besonders viele (und eventuell unnötige) #includes
auf die Laufzeit aus?

Gar nicht. Entweder werden die ‚includes‘ gebraucht,
dann sind sie so und so ‚drin‘ - oder nicht, dann
werden sie ignoriert.

Was ist besser für die Laufzeit? Daten auf dem Stack zu
speichern oder den Heap zu benutzen? Wie sieht es bei
Objekten aus: besser auf den Stack oder auf

Daten, die auf dem Stack liegen, werden „erzeugt“
wenn der Programmaublauf in den ‚scope‘ der umgebenden
Funktion kommt. Der „Zugriff“ zwischen Stack und
Global ist identisch. Hier ist auch nicht konkret
genug gefragt, worauf es genau ankommt.

Gibt es sonst noch Tips und Tricks die
man zu beachten hätte?

  • Niemals das Programm zu ‚optimieren‘ versuchen,
  • Prüfen, dass größere Datenblöcke bei der Über-
    gabe als Referenz oder Zeiger übergeben werden,

Grüße

CMБ