003
10.12.2004, 09:13 Uhr
virtual
Sexiest Bit alive (Operator)
|
Ein paar Anmerkungen:
C++: |
for(int i=0; i<v.size(); ++i) { sum += v[i]; }
|
Solche trivialen Konstrukte, da hat (un)wissender recht, werden oft von Compilern dahingehend optimiert, daß das size rausgeschmissen wird. (Verläßlich ist das aber nicht). Aber bei komplexeren Schleifen ist dies mit zunehmender Komplexität unwahrscheinlicher, zB dieser Code:
C++: |
int x(std::vector<int>& v, in i) { // Fehlende const-Korrektness, sorry, ist aber so! return v[i]; } ... for(int i=0; i<v.size(); ++i) { sum += x(v,i); }
|
Wird der Compiler nicht den Size-Call wegoptimieren (können).
Letztlich verhält es oft so (aber auch das ist nicht garantiert), daß vector.size() eine inline Funktion ist; mit anderen Worten: der Zugriff "v.size()" reduziert sich auf das Auslesen einer Speicherstelle im RAM, genauso, wie wenn er es aus einer zuvor angelegten Variablen machen müsste, wenn Du dort size() drin speichert. Ein "vernünfigter" Compiler würde mithin sogar diese Variable wegoptimieren.
Wenn wir also von einem "vernünftigen Compiler" ausgehen, dann nach es gehopst wie gesprungen wie du es machst.
Nun könnte man auf die Idee kommen Code schreiben zu wollen, der auf für unvernünftige Compiler "optimal performant" ist. Tipp: lass es sein. Solche Konstrukte sind in der regel schwerer zu lesen als das eingangserwähnte Beispiel:
C++: |
int size = v.size(); for(int i=0; i<size; ++i) { sum+=v[i]; }
|
Abgesehen davon werden die meisten Programme qualitativ schlechter, wenn man so einen Kleinsch*** optimiert... Lange Rede kurzer Sinn: Optimiere Algorithmen, nicht Code -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) |