Frage

Welcher der folgenden hat die beste Leistung?

Ich habe gesehen, dass Methode zwei in JavaScript mit enormen Leistungssteigerungen implementiert wurde. Allerdings konnte ich in C# keinen Gewinn messen und habe mich gefragt, ob der Compiler Methode 2 bereits ausführt, selbst wenn er wie Methode 1 geschrieben ist.

Die Theorie hinter Methode 2 ist, dass der Code nicht bei jeder Iteration auf DataTable.Rows.Count zugreifen muss, sondern einfach auf int c zugreifen kann.

Methode 1

for (int i = 0; i < DataTable.Rows.Count; i++) {
    // Do Something
}

Methode 2

for (int i = 0, c = DataTable.Rows.Count; i < c; i++) {
    // Do Something
}
War es hilfreich?

Lösung

Nein, das kann es nicht, da es keine Möglichkeit gibt, es auszudrücken über die Zeit konstant für einen Wert.

Wenn der Compiler dazu in der Lage sein sollte, müsste der Code, der den Wert zurückgibt, garantieren, dass der Wert konstant ist und sich für die Dauer der Schleife nicht ändert.

In diesem Fall steht es Ihnen jedoch frei, im Rahmen Ihrer Schleife neue Zeilen zur Datentabelle hinzuzufügen, und es liegt daher an Ihnen, diese Garantie auf die Art und Weise zu geben, wie Sie es getan haben.

Kurz gesagt führt der Compiler diese Optimierung nicht durch, wenn der Endindex etwas anderes als eine Variable ist.

Im Fall einer Variablen, bei der der Compiler einfach den Schleifencode betrachten und feststellen kann, dass diese bestimmte Variable nicht geändert wurde, könnte er dies tun und den Wert in ein Register laden, bevor er die Schleife startet, aber dadurch entsteht kein Leistungsgewinn wäre höchstwahrscheinlich vernachlässigbar, es sei denn, Ihr Schleifenkörper ist leer.

Abschluss:Wenn Sie wissen oder bereit sind zu akzeptieren, dass der Endschleifenindex für die Dauer der Schleife konstant ist, platzieren Sie ihn in einer Variablen.


Bearbeiten: Lesen Sie Ihren Beitrag noch einmal, und ja, möglicherweise stellen Sie auch in Ihren beiden Fällen vernachlässigbare Leistungssteigerungen fest, da der JITter den Code optimiert.Der JITter optimiert möglicherweise Ihren Endindex-Lesevorgang in einen direkten Zugriff auf die Variable in der Datentabelle, die die Zeilenanzahl enthält, und ein Speicherlesevorgang ist ohnehin nicht allzu teuer.Wenn Sie andererseits lesen würden, dass es sich bei Immobilien um eine sehr kostspielige Operation handelt, würden Sie einen deutlicheren Unterschied feststellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top