ich laufe eine schleife ca. 100000 maldurch. Dabei greife ich in der schleife bei jeder iteration auf einen std::vector<float> zu.
Meine Frage ist: Ist es langsamer wenn ich den vector global in der klasse als member anlege als wie wenn ich den vector durchschleife und immer mit in die methoden übergebe? Oder spielt das keine Rolle?
Ist das prinzipiell so dass der zugriff auf globale variablen langsamer ist?
Das ist solange du mit call by reference den Vektor übergibst egal, da in jedem Fall nur einfach indirekt adressiert wird, der einzige Geschwindigkeitsunterschied liegt darin, das du beim Aufruf der Methode einen mov mehr hast um die Adresse von dem Vektor auf den Stack zu legen, bei 100000 mal könnte sich das je nach Masse der Methodenaufrufe vielleicht bemerkbar machen.
danke, habe ich das richtig verstanden dass da ich in der schleife auf den vector nur über vector[idx] zugreife und ich nur die referenz in den Methodenaufrufen habe ich lediglich einen mov mehr für die Auslagerung der Adresse des vectors auf den stack habe? Das wäre ein vernachlässigbarer geschwindigkeitsunterschied oder?
Das heisst jetzt dass der Zugriff auf einen global liegender vector nicht unbedingt langsamer ist oder?
Danke für das Angebot, ich arbeite mit QT zusammen was hier wohl nicht hergehört aber im grunde sieht die Methode nur so aus wie folgt - im methodenaufruf ist nur height, width und der rgb-vektor des originalbildes. ich weiß nicht ob es euch wassagt aber es soll ein Gauss filter sein:
C++:
for(int y = 0; y < height; y++) { index = y; offset = y * width; for(int x = 0; x < width; x++) { line_offset = x - mid; for(int col = 0; col < cols; col++) { inner_offset = line_offset + col;
kernel ist der std::vector<float> der global liegt. mir ging es jetzt eben darum zu wissen ob ich noch performance rausholen kann wenn ich den kernel eben als referenz übergebe oder nicht
der code sieht soweit gut aus. ich würde wenn möglich immere eine übergabe bei referenz machen. ob nun der vector global oder nicht ist, spielt praktisch keine rolle
naja ob member/global oder per übergabe spielt schon eine gewisse rolle: Wenn die Funktion 100000 mal aufgerufen wird sind mind. 200000 befehle mehr: einmal adresse auf den stack und einmal wieder runter beim verlassen der funktion. Eigentlich sogar noch mehr, da er die adresse dann erst noch zigmal vom stack in register und umgekehrt schieben muss um damit zu arbeiten. Als globale/member Var kann es sein das dir der compiler die Adresse gleich in eines der "sekundären" register legt und direkt für jede funktion nicht extra neu aufn stack legt und wieder holt. -- class God : public ChuckNorris { };
aber meine 3-fach schleife wird insgesamt exakt nur 2 mal aufgerufen. Nur in der methode dann rödelt er. D.h. insgesamt habe ich nur 2 mal mehr ein mov der adresse des vektors. Oder verstehe ich da wasfalsch? Er muss doch innerhalb der schleifen nicht immer die adresse auf den stack etc... legen oder?
nein wenn die funktion nur 2x aufgerufen wirst hast du ca 4 Befehle mehr. Da ist der Unterschied dann gering. Ansonsten sollte man eben schauen ob es nicht besser ist in seiner Kapselung eine Membervariable zu benutzen (wenn die funktion z.b teil einer klasse ist) oder ob sie dann von außen im Endeffekt eine "Schnittstelle" zu deiner Klasse darstellt. Der Grundsatz "trau keinen Daten" gilt nun mal wie in der Webentwicklung eigentlich auch bei der Anwendungsentwicklung, vor allem bei größeren komplexen Anwendungen, evtl am schlimmsten noch in nem team -- class God : public ChuckNorris { };