Thomas Woelfers Baustatik Blog

Baustatik-Software und was sonst des Weges kommt

Eine Optimierung die man besser vermeidet

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.

Comments (3) -

  • Thomas

    3/7/2005 6:05:44 AM |

    Also bei mir würde sich der Compiler bei sowas verschlucken Wink

    for( int i=0; i---->{
       a[i] = 0;
    }

  • A. Wölfer

    3/7/2005 6:22:56 AM |

    Hallo!

    Ich denke auch, dass da ein wenig Code fehltSmile



  • thomas woelfer

    3/7/2005 7:38:09 AM |

    Thomas, Andreas,

    vielen dank für den hinweis. ich habe das gerade korrigiert.

    das problem ist wohl, das 'dasBlog' probleme beim posten von quellcode hat. beim 'ersten' posten geht das zwar prima, bearbeitet man das posting dann aber spaeter (z.b. um einen tippfehler zu korrigieren), dann werden teile des quellcodes verschluckt. m.a.w.: will man ein posting mit quellcode bearbeiten, dann muss man wohl jedesmal sicherstellen, das der auch noch ok ist.

    habe das schon bei sourceforge als bug eingetragen.

Comments are closed