Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » Performance hängt in einer Funktion

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
07.05.2007, 14:45 Uhr
flappinski



Hallo Leute,
mein mehrere tausend Zeilen-Programm hängt zu 93 Prozent in den folgenden drei Zeilen. Hier werden zwei Char-Vektoren (Möglichkeiten -1,0,1,2 für gt_list und -1,0,1 für pi) und die Addresse des Ergebnisses übergeben. Die Funktion soll anhand der Datenlage eine 6-Felder-Tafel füllen. -1 bedeutet fehlender Wert und wird ignoriert. gt -List bezeichnet die Spalte, pi die Zeile der 6-Felder Tafel:
Beispiel:

gt: 0 1 1 2 1 0 0 0 0 0
pt: 1 0 0 0 1 1 1 0 0 0

soll ergeben:

3 2 1
3 1 0

die beiden Vektoren sind auf alle Fälle gleich lang und gleiche Positionen gehören zusammen.

natürlich sind die Originaldaten viel grösser und ausserdem wird diese Funktion bis zu 500 Millionen mal aufgerufen. Deshalb würde sich eine schlaue Implimentation stark auswirken. Ersatunlicherweise hat sich der Wechsel von einer mathematischen Eingliederung von pt in eine Switch-Anweisung schon bezahlt gemacht. Bei gt funktioniert das nicht (wahrscheinlich wegen der einmal häufigeren Abfrage).


C++:
//GENNO hat den Wert -1
void fill_table6f_cc(std::vector <signed char> gt_list, std::vector <signed char>::const_iterator pi, int* f6f){
      std::vector <signed char>::const_iterator gt_list_end = gt_list.end();
      for (std::vector <signed char>::const_iterator gi=gt_list.begin(); gi !=gt_list_end; gi++, pi++){

      register signed char gt = (*gi);
      register signed char pt = (*pi);

     if (gt!=GENNO){
         switch(pt){
         case 0: f6f[gt]++; break;
         case 1: f6f[gt+3]++; break;
         }
     }

      }

}




hier ist das gleiche als reine Zeiger-Version. Da habe ich mir Performance-Gewinn versprochen, und es ist dann aber langsamer geworden! Allerdings ist dieser Unterschied bei angeschalteter Optimierung wieder weg. INTNO ist hier auch global als -1 definiert;


C++:
void fill_table6f_cc(std::vector <signed char> gt_list, std::vector <signed char>::const_iterator pi, int* f6f){
      std::vector <signed char>::const_iterator gt_list_end = gt_list.end();
      for (std::vector <signed char>::const_iterator gi=gt_list.begin(); gi !=gt_list_end; gi++, pi++){


      if (*pi!=INTNO && *gi!=GENNO){
          int* field=f6f;
          field+=(*pi)*3;
          field+=*gi;
          (*field)++;
      }

      }

}




Habt Ihr eine Idee, wie ich in diesen paar Zeilen was rausholen kann?
Vielen Dank,
sTephan
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
07.05.2007, 15:01 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


hi,
benutz mal überall ++variable anstatt variable++, das spart dir ebensoviele pushs/pops wie du ++e hast.
dann könntest du "register int gt" benutzen, statt char - zumindest für 32bit system dürfte das evtl schneller sein.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
07.05.2007, 16:46 Uhr
flappinski



Hi FloSoft,
danke erstmal für Deine Antwort. Es hat was gebracht, allerdings nicht gerade viel (ca. 3% schneller). Welche ++ meinstest Du denn? die Zeiger oder die Inhalte? Und meintest Du das erste oder das zweite Beispiel?
Beim 2. Beispiel macht es übrigens gar nichts aus.
Gruß,
Stephan
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
07.05.2007, 16:49 Uhr
Bruder Leif
dances with systems
(Operator)


Warum uebergibst Du einen Iterator fuer pi, aber gleich die ganze Liste fuer gt? Wenn, dann eine const-Referenz, sonst wird bei jedem Aufruf die Liste nochmal uebergeben...
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
07.05.2007, 17:03 Uhr
flappinski



das stimmt schon, aber in der Optimierung wird die Funktion doch sowieso als inline eingebunden, das sollte keinen Unterschied machen, aber ich werde das mal testen... danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


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: