Die String-Verkettung in java-StringBuilder
Ich habe ein legacy-Java-Datei, die verwendet die String-Verkettung zu bauen große String-Objekte.Seine eine ernsthafte performance-Problem.Gibt es eine Methode, wie solche, die die folgenden
String test="I am a very bad programmer"
+"to use concatenation"
+"Instead of StringBuilder"
+" or StringBuffer";
zu
StringBuilder strBuilder= new StringBuilder();
strBuilder.append("I am a bad programmer");
strBuilder.append("to use concatenation");
strBuilder.append("Instead of StringBuilder");
strBuilder.append(" or StringBuffer");
String str= strBuilder.toString();
im Prinzip brauche ich eine stub, die in java nur ein String Instanziierung als Eingabe und konvertiert in die Klasse StringBuilder.Jemand versuchte, diese in der Vergangenheit?
AFAIK StringBuilder und StringBuffer gibt nur einen performance-Schub, wenn mit Ihnen in einer Schleife, da der compilter automatisch konvertiert normale Verkettung StringBuilder(?).
Sind Sie sicher, dass Sie nicht über Ihre performance-Engpass woanders?
sollten Sie habe dies als eine Antwort, kein Kommentar.
Vielen Dank für Ihren Vorschlag weiterhin StringBuilder als und wenn benötigt.
die verlinkte Frage ist anders, weil es nicht mit static "strings". Es verwendet einen Funktionsaufruf in der Verkettung. Meine Aussage gilt für das gegebene Beispiel in das Frage. Inklusive der Funktionsaufrufe ändert sich das Bild.
Sind Sie sicher, dass Sie nicht über Ihre performance-Engpass woanders?
sollten Sie habe dies als eine Antwort, kein Kommentar.
Vielen Dank für Ihren Vorschlag weiterhin StringBuilder als und wenn benötigt.
die verlinkte Frage ist anders, weil es nicht mit static "strings". Es verwendet einen Funktionsaufruf in der Verkettung. Meine Aussage gilt für das gegebene Beispiel in das Frage. Inklusive der Funktionsaufrufe ändert sich das Bild.
InformationsquelleAutor Harish | 2011-03-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen festen buchstäblichen wie in Ihrem Beispiel ist effizienter als die Verwendung von StringBuilder.
Die Feste Literale werden vom compiler erkannt und wird inline als ein einzelner Wert, also die beiden Linien
und
generieren, die genau die gleichen bytecode.
Ist das Bild anders, obwohl, wenn die Verkettung ist nicht getan mit Literale, aber mit Funktion fordert.
Wenn Sie brauchen, um Anhängen von strings dynamisch, lieber StringBuilder über StringBuffer, weil es etwas schneller ist, da es nicht synchronisiert ist.
Hier ist das Beispiel-bytecode:
den generierten bytecode für diese Klassen ist:
Wie man sehen kann, sind beide Variablen in der gleichen Weise behandelt.
Ich glaube nicht, dass diese gehört zu der Sprache, die Spezifikation, wie das ist "nur" ein compiler-Optimierung.
Einen anderen compiler (ich war mit dem Sun-compiler) sein könnte, etwas völlig anderes - das ist OK, solange sich das Verhalten nicht ändern.
erstellen Sie einfach zwei test-Klassen und de-kompilieren Sie Sie mit
javap -c
habe nicht die Zeit jetzt 🙂 btw, javac oder eclipse?
Ich fügte hinzu, ein Beispiel mit javac (ich benutze nicht Eclipse)
InformationsquelleAutor a_horse_with_no_name
Nein, es ist nicht ein performance-Problem. Wenn Sie die Verkettung der Zeichenfolge inline (genauso wie die, die Sie zeigte), anstatt mit einer Schleife zum Beispiel dann der compiler automatisch wandelt die
+
Verwendung einerStringBuilder
. Überprüfen Sie die Dokumentationjava.lang.String
Sogar noch weiter - der compiler kann die Tatsache, dass diese sind alle string-Konstanten und nehmen Sie Sie auch vor der Laufzeit (JLS Referenzen)
InformationsquelleAutor Bozho
Eigentlich der compiler schon gilt, dass die Optimierung für Sie in den neuesten Versionen von Java (mindestens 1,5, denke ich).
Was passiert, wenn Java-Compiler sieht viele String-Verkettungen in eine Zeile?
http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.18.1.2
InformationsquelleAutor Al-Khwarizmi
Nur konstanter string contatenation ist optimiert zur compile-Zeit und ist trivial. Das Problem ist, wenn man etwas weniger trivial:
String beispiel1 = "Prefix" + variableString1 + "Suffix";
schlimmsten Fall ist Schleifen mit Anhängen, wo jeder iteration muss eine neue Zeichenfolge. Da dies Häufig für gepufferte Lesevorgänge von Dateien Sie können sehr große strings wird neu erstellt, ein problem hatte ich vor kurzem.
Während ich sehen, warum Sie wollen würde, um zu tun, was Sie tun, die Strukturen des code sind zu Verschieden, um Sie einfach vorbei und ersetzen, und ein Skript, um den code Bearbeiten müsste schon Recht weit Fortgeschritten zu sein in der Lage, sich mit all den Referenzen. Vielleicht gibt es eine Möglichkeit mit annonomous innere Klassen, obwohl, können Sie immer den gleichen string Referenz, sondern wickeln den eigentlichen Bau in string-Builder. Es ist wohl nicht anders als das, was das Optimierungstool bereits tut aber
InformationsquelleAutor K.Barad