Eine Optimierung die man besser vermeidet


Thomas Wölfer
Thomas Wölfer

06. März 2005


Angenommen, man hat ein Objekt, über das iteriert werden kann - zum Beispiel ein String oder ein Array. Den dafür zuständigen Code würde jeder C++ Programmierer wie folgt hinschreiben:

int l=a.Length;
for( int i=0; i<l; i++)
{
a[i] = 0;
}

Grund dafür: Das Zugriff auf die Länge wird aus der Schleife entfernt, und damit wird die Performance der Schleife besser.

Das gilt nicht in der CLR.

Statt dessen verwendet man folgenden Code:

for( int i=0; i<a.Length; i++)
{
a[i] = 0;
}

Der untere Code ist im Rahmen von .Net Code tatsächlich schneller als das erste Beispiel. Der Grund dafür ist der, das die CLR bei jedem Zugriff auf ein Array einen Bounds-Check durchführen muss - es sei denn, der JIT Compiler kann 'sehen', das auf keinen Fall ein Überschreiten der Array-Grenzen eintreten wird.

Im zweiten Code-Beispiel kann er das - und darum wird bei diesem Code der Bounds-Check auch nicht durchgeführt. Und das wiederum führt dazu, das der untere Code tatsächlich schneller ist als der obere. Praktischer Nebeneffekt: Die Sache ist außerdem besser lesbar.

Edit: Der Code wurde nicht richtig dargestellt, sodas Teile fehlten. Danke für die Hinweise per Kommentar... :-)
Jetzt klappt es aber mit der Anzeige.