static Methodenvariablen
-
Hallo ich hab mal wieder eine frage. Diesmal geht es um die Performance.
Ich hab eine Funktion von der ich weiß das diese öffters aufgerufen wird. Diese bildet Normale aus einer Heigthmap und gibt einen Vektor als Referenz zurück. Für die Bildung des Vektors benötige ich 4 Hilfsvektoren. Nun hab ich mir überlegt ob ich den Rückgabevektor( wegen der Referenz) und die 4 Hilfsvektoeren static machen soll, um die ständige erzeugung zu verhindern.
Vektorklasse ist Ogre::Vector3
-
Allgemeine Antwort: Solche Mikrooptimierungen kann man nur durch Ausprobieren testen.
Spezielle Antwort (da ich es schonmal ausprobiert habe): Das bringt genau 0.
Technischer Hintergrund: Das "Erzeugen" von Variablen auf dem Stack verbraucht nämlich überhaupt keine Zeit, sofern kein Konstruktor aufgerufen wird (was bei POD-Typen der Fall ist). Die Variablen sind dann nämlich nur fest im Programm verbaute Adressen, das static verändert nur, wo diese im Speicher stehen. Im schlimmsten Fall kann man eventuell sogar etwas Geschwindigkeit verlieren, da man eventuell nicht mehr alle Variablen nahe zusammen im Speicher stehen hat. Der Zugriff auf auseinanderliegende Speicherbereiche kann nämlich langsamer sein als der Zugriff auf zusammenhängenden Speicher. Der Compiler kann aber wieder schlau genug sein, dies wieder zu optimieren, egal ob man static geschrieben hat oder nicht.
-
ok Danke
-
wenn ich deine Aussage richtig verstanden hab bezieht sich diese nur auf PODs. Da ich die Implementierung der Klasse nicht kenn kann ich zu dieser keine Aussagen machen, müsste im Öffentlichen Source nachschaun wobei man davon ausgehen kann das 3 floats oder ähnliches gespeichert werden. Die 5 Vektoren sind die einzigen Variablen die in der Funktion verwendet werden, mit einem Array welches die Höhen speichert(wird zur Laufzeit erzeugt). Daher sehe ich keine verluste bei statischen Variablen. Meine vermutung war die Zeitersparung beim Erzeugen dieser Objekte.
Aber wen ich irgendwo mal einen Flaschenhals bekomm, dann wahrscheinlich nicht wegen den Variablen. Zumal heutige Compiler gut optimieren können
-
123 schrieb:
wenn ich deine Aussage richtig verstanden hab bezieht sich diese nur auf PODs. Da ich die Implementierung der Klasse nicht kenn kann ich zu dieser keine Aussagen machen, müsste im Öffentlichen Source nachschaun wobei man davon ausgehen kann das 3 floats oder ähnliches gespeichert werden. Die 5 Vektoren sind die einzigen Variablen die in der Funktion verwendet werden, mit einem Array welches die Höhen speichert(wird zur Laufzeit erzeugt). Daher sehe ich keine verluste bei statischen Variablen. Meine vermutung war die Zeitersparung beim Erzeugen dieser Objekte.
Aber wen ich irgendwo mal einen Flaschenhals bekomm, dann wahrscheinlich nicht wegen den Variablen. Zumal heutige Compiler gut optimieren könnenWie gesagt, das Erzeugen von Variablen an sich kostet normalerweise keine Zeit. Um Flaschenhälse zu finden bietet es sich an, das Programm durch einen Profiler zu jagen. Normalerweise verbringt ein Programm 80-90% der Laufzeit in seiner innersten Schleife. Das ist daher die einzige Stelle die sich überhaupt zu optimieren lohnt. Und ein guter Profiler sagt einem auch genau, was in dieser Schleife die meiste Zeit braucht. Und dann kann man entscheiden (oder ausprobieren!), ob diese Aktion noch weiter optimierbar ist.