Soll ich System.getProperty ("line.separator") zwischenspeichern?

8

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 ?

verwenden

Oder System.getProperty("line.separator") ist so schnell wie ein statisches Feld?

    
Adam Stelmaszczyk 04.08.2013, 17:07
quelle

5 Antworten

3

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.

%Vor%

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.

    
Marko Topolnik 04.08.2013, 17:31
quelle
3

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.

    
MightyPork 04.08.2013 17:09
quelle
2

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?

    
Alex MDC 04.08.2013 17:11
quelle
1

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:

%Vor%

... 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.

    
T.J. Crowder 04.08.2013 17:09
quelle
0

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.

    
Alejadro Xalabarder 08.12.2017 00:25
quelle

Tags und Links