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 |