Betrachten Sie eine solche Methode:
%Vor% System.getProperty("line.separator")
kann viele Male aufgerufen werden.
Soll ich diesen Wert mit public final static String lineSeperator = System.getProperty("line.separator")
zwischenspeichern?
und später nur lineSeperator
?
Oder System.getProperty("line.separator")
ist so schnell wie ein statisches Feld?
Ich sehe Ihre Frage als eine falsche Dichotomie darstellend. Ich würde weder getProperty
jedes Mal aufrufen noch ein statisches Feld dafür deklarieren. Ich würde es einfach in eine lokale Variable in toString
extrahieren.
BTW Ich habe den Aufruf bewertet. Der Code:
%Vor%Die Ergebnisse:
%Vor%Der zwischengespeicherte Ansatz ist mehr als zwei Größenordnungen schneller.
Beachten Sie, dass der Gesamteindruck von getProperty
call für all diese String-Erstellung sehr, sehr unwahrscheinlich ist.
Sie müssen nicht befürchten, dass sich der Zeilentrenner ändert, während der Code ausgeführt wird. Daher sehe ich keinen Grund, ihn nicht zwischenzuspeichern.
Das Cachen eines Wertes ist sicherlich schneller als das wiederholte Ausführen eines Aufrufs, aber der Unterschied wird wahrscheinlich vernachlässigbar sein.
Da es so einfach ist, warum nicht? Zumindest muss die Implementierung von System.getProperty()
eine Hashtabellensuche durchführen (selbst wenn sie intern zwischengespeichert wird), um die Eigenschaft zu finden, die Sie anfordern. Dann wird die virtuelle Methode getString()
aufgerufen das resultierende Objekt. Keines davon ist sehr teuer, muss aber mehrmals aufgerufen werden. Nicht zu vergessen, viele String
provisories werden erstellt und benötigen GCing nach.
Wenn Sie dies an den Anfang Ihrer Schleife verschieben und denselben Wert verwenden, vermeiden Sie alle diese Probleme. Also warum nicht?
Wenn Sie auf ein Leistungsproblem aufmerksam geworden sind, von dem Sie wissen, dass es damit in Zusammenhang steht, ja.
Wenn Sie nicht haben, dann nein, die Suche hat wahrscheinlich nicht genug Aufwand, um wichtig zu sein.
Dies würde unter eine oder beide der allgemeinen Kategorien "Mikrooptimierung" und "vorzeitige Optimierung" fallen. : -)
Aber wenn Sie sich Sorgen um Effizienz machen, haben Sie wahrscheinlich eine viel größere Chance, indem Ihre toString
-Methode die Zeichenfolge jedes Mal neu generiert. Wenn toString
viel aufgerufen wird, speichern Sie den generierten String zwischen, anstatt den Zeilenabschluss zwischenzuspeichern, und deaktivieren Sie diesen immer dann, wenn sich Ihre Raumkarte ändert. Zum Beispiel:
... und wenn sich deine Karte ändert, mache
%Vor%Das ist ein viel mehr Knall für den Dollar (der Dollar ist der Overhead eines zusätzlichen Feldes). Zugegeben, es ist per-Instanz und nicht pro Klasse, so (Verweis früheren Kommentar über Effizienz) nur tun, wenn Sie einen guten Grund haben.
Wenn die Systemeigenschaft während der Anwendung garantiert konstant bleibt, kann sie zwischengespeichert werden, aber im Allgemeinen verlieren Sie die Eigenschaft der Eigenschaft, die das Verhalten ändert, wenn Sie sie ändern.
Zum Beispiel könnte ein Textgenerator die Eigenschaft verwenden, um Text für Windows oder für Linux zu generieren und die Eigenschaft in der Anwendung dynamisch ändern zu lassen, warum nicht?
Im Allgemeinen bedeutet das Abfangen einer Eigenschaft, die Funktion setProperty unbrauchbar zu machen.
Tags und Links java optimization caching