Lokale Variablen oder Klassen-Felder?
Las ich heute einen Beitrag über die performance-Verbesserung in C# und Java.
Ich immer noch nicht auf dieses:
19. Verwenden Sie nicht zu viele Instanz-Variablen
Leistung kann verbessert werden, durch die Verwendung von lokalen Variablen. Der code in Beispiel 1 wird schneller ausgeführt als code im Beispiel 2.
Beispiel1:
public void loop() {
int j = 0;
for ( int i = 0; i<250000;i++){
j = j + 1;
}
}
Beispiel 2:
int i;
public void loop() {
int j = 0;
for (i = 0; i<250000;i++){
j = j + 1;
}
}
In der Tat, ich verstehe nicht, warum es schneller sein soll zu instanziieren, einige Speicher, und geben Sie es jedes mal, wenn ein Aufruf der loop
Funktion ist fertig, wenn ich könnte einen einfachen Zugriff auf ein Feld.
Es ist Reine Neugier, ich bin nicht versucht, die variable 'i' in der Klasse' scope :p
Das ist wahr, das ist schneller auf der Verwendung von lokalen Variablen? Oder vielleicht auch nur in manchen Fällen?
- Ich denke, der performance-Unterschied sollte vernachlässigbar sein, Sie sollten mehr besorgt über die Entwickler die performance in den code zu verstehen. Wenn Sie ein Feld oder eine Eigenschaft, die sollte sein eine lokale variable, ich würde Sie Konflikte werden in das Verständnis der Zweck. Wenn Sie wissen wollen, den Unterschied in der Leistung, warum nicht benchmark (oder Lesen Sie die IL, die beide erzeugen)?
- Der Zugriff auf die variable aus dem stack ist wahrscheinlich schneller als der Zugriff auf Sie durch einen heap-Verweis.
- So viel schlechte Beratung in diesem Artikel, weiß ich nicht, wo Sie anfangen
- eine Antwort könnte ein guter Ort sein.
- Artikel 1, 3, 4, 5, 7, 16, 17, 18, 20 aus dem Artikel sind alle schlecht beraten. Vieles davon ist die veraltete Java-performance folklore. Der Autor nicht selbst stilisieren Java korrekt (es ist Java und nicht JAVA).
- "Tipps und tricks für performance-Listen" sind im Allgemeinen schlimmer als wertlos: Sie sind aktiv schädlich, weil Sie ermutigen, ein schlechter Ansatz, um die Leistung. Die Leistung muss angesprochen werden, wie eine engineering-Disziplin, die verwendet sorgfältig ausgewählte Metriken, kundenorientierte Ziele, empirische Messungen und gezielte Korrekturen. Tipps und tricks Listen fördern, Mikro-Optimierungen, die nicht eigentlich jeder profitieren und in vielen Fällen machen die Leistung schlechter.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stack schneller als Heap.
Vergessen Sie nicht das Prinzip der Lokalität von Daten. Lokale Daten sollte besser sein-Cache in der CPU-cache. Wenn die Daten nahe, Sie wird geladen vollständig in die CPU-Caches und die CPU nicht haben, um Sie aus dem Speicher.
Ist die Leistung nach unten, um die Anzahl der Schritte, die erforderlich sind, um die variable. Lokale variable, die Adressen sind zum Zeitpunkt der Kompilierung bekannt (Sie sind ein bekannter offset auf den stack), um den Zugriff auf ein Mitglied sind, laden Sie das Objekt "this", um die Adresse des eigentlichen Objekts, bevor Sie bekommen können, die Adresse der member-Variablen.
Selbst wenn, es wird sein, es wird fast nicht messbarer Unterschied in diesen Fällen. Probabbly im ersten Fall, gibt es einige Optimierungen durchgeführt, die auf Prozessor-registry-Ebene, aber wieder:
In Bezug auf Speicher, es ist genau das gleiche, es gibt keinen Unterschied.
Ersten Fall ist es im Allgemeinen besser: wie erklären Sie die variable dort waren es unmittelbar verwendet, die Häufig verwendet wird, gutes Muster, wie es
loop
- Methode aufgerufen wird oder nicht.loop
Methode beendet wird, aber nicht im Fall von Beispiel 2.i
ist immer konsumiert, so lange wie die Instanz der Klasse im Speicher, nicht so für das erste Beispiel, es ist nur vorübergehend, während die Methodeloop
ausgeführt wird.In C# ein weiterer kleiner Unterschied ist die Anzahl der erzeugten MSIL-Anweisungen (ich denke, es ist ähnlich wie in Java).
Dauert es zwei Anweisungen zum laden einer Instanz-Feld:
...aber es dauert nur eine Anweisung zum laden einer lokalen variable:
Ich vermute, es gibt sehr wenig Unterschied, aber in dem Fall, wo die variable ist ein member des Objekts, jeder Zugriff erfordert einen Umweg über
this
(effektiv), in der Erwägung, dass die lokale variable nicht.Mehr in der Regel, das Objekt hat keine Notwendigkeit für ein Mitglied
i
es nur genutzt, um im Rahmen der Schleife, so dass Sie lokal auf deren Nutzung ist besser in jedem Fall.Getestet habe ich eine Berechnung mit 500 000 Iterationen, wo ich etwa 20 Variablen, die lokal und eine, die funktioniert es mit den Feldern. Die lokale variable test war etwa 20 Millisekunden-und das mit Felder war etwa 30 Millisekunden. Einen erheblichen performance-Gewinn, wenn Sie lokale Variablen verwenden.
Ob der performance-Unterschied relevant ist, hängt von dem Projekt ab. In Ihrer durchschnittlichen business-Anwendung, die performance-Gewinn kann nicht erkennen, und es ist besser zu gehen für lesbarer /wartbarer code, aber ich arbeite auf sound-Synthese-software, wo nano-Optimierungen wie diese tatsächlich relevant werden.