Dienstag, 8. Februar 2011

for-Schleifenperformance über eine Liste

Frisch gefunden - eine Schleifenvariante, bei der wohl jemand meinte noch ein bisschen Performance rauskitzeln zu wollen:

for (int i=0, j=list.size(); i < j ; i++) {...

Häufiger sieht man das so:

for (int i=0; i < list.size(); i++) {...

Die zweite Version ruft für jeden Durchlauf die size-Methode der Liste auf. Das wollte der Schreiber der ersten Version wohl sparen, wie ich finde zu lasten der Lesbarkeit. Wenn man das auf Grund sehr vieler zu erwartender Durchläufe tatsächlich sparen möchte, könnte man natürlich auch einen Zweizeiler daraus machen, was wohl auch die geläufigere Form ist:

int len = list.size();
for (int i=0; i < len; i++) {...


Die Schleife rückwärts laufen zu lassen, wäre eine weitere Idee (keine besonders gute, wie ich finde), den Methodenaufruf zu sparen. Auch hier erfolgt die Initialisierung nur ein einziges mal und wir sparen sogar die zweite Variable:

for (int i=list.size()-1; i>=0; i--) {...

Meiner Meinung nach, lohnt die Einbuße der Lesbarkeit in diesem Fall nicht. Die size-Methode gibt nur den Wert einer Instanz-Variablen zurück, was nicht viel kostet. Bei wenigen hundert Durchläufen jedenfalls kaum messbar und definitiv nicht fühlbar.

In dem gefundenen Fall bearbeitet die Schleife übrigens eine Liste mit ungefähr einer Hand voll Einträgen.

Kommentare:

  1. Hallo, was Du da schreibst macht gar keinen Sinn. Der langsamste Aufruf dürfte das folgende: list.get(i) sein, weiterhin ist - schneller als + und != schneller als <, > und ==. Verwende einfach einen Iterator oder foreach und überlasse die Schleife dem Kompiler. Lesbarkeit einer so einfachen Schleife ist für Anfänger und Quellcodemaler.

    AntwortenLöschen
  2. Hi, Deinem Hinweis stimme ich aus vollem Herzen zu! Nach dem ich den ersten Schleifenkörper so vorgefunden habe, habe ich das noch ein wenig weiter assoziiert. Mir ging es vordergründig um den Schleifenkopf und der Intention des ursprünglichen Schreibers und weniger um den Schleifenkörper. Tatsächlich hätte das aber am besten in dem Hinweis münden sollen, dass man für sowas einen Iterator verwendet.

    AntwortenLöschen