Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Zugriff auf globalen vector langsam?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
18.08.2006, 12:46 Uhr
~gggggg
Gast


Hallo,

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?

Ich bin dankbar für jede Hilfe!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.08.2006, 13:10 Uhr
~Blubber2063
Gast


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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.08.2006, 13:53 Uhr
~gggg
Gast


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?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.08.2006, 13:54 Uhr
enriico



schick doch mal den code, dann können wir dir sagen, was besser gemacht werden könnte!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.08.2006, 14:10 Uhr
~gggg
Gast


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;
                
                if((inner_offset < 0) || (inner_offset >= width))
                    continue;
            
                f = kernel[col];  
                
                rgb_val = vec_img[offset + inner_offset];
                
                r = (rgb_val >> 16) & 0xff;
                g = (rgb_val >> 8) & 0xff;
                b = rgb_val & 0xff;
                
                sumr += r * f;
                sumg += g * f;
                sumb += b * f;
                gauss_sum += f;                
            }
            new_r = static_cast<int>(sumr / gauss_sum);
            new_g = static_cast<int>(sumg / gauss_sum);
            new_b = static_cast<int>(sumb / gauss_sum);
            
            blurred[index] = (new_r << 16) |
                              (new_g << 8) |
                                    new_b;
            
            sumr = 0.0;
            sumg = 0.0;
            sumb = 0.0;
            gauss_sum = 0.0;
            index += height;  
        }  
    }



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

Danke euch vielmals
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
18.08.2006, 14:24 Uhr
enriico



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
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
18.08.2006, 14:49 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


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 { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
18.08.2006, 15:04 Uhr
~gggg
Gast


Danke FloSoft,

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?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
18.08.2006, 18:16 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


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 { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: