11 Stimmen

Wie hoch sind die Leistungskosten für die Zuweisung eines einzelnen Zeichenkettenwerts unter Verwendung von Pluszeichen?

Ich habe mich oft gefragt, gibt es eine Leistung Kosten der Aufteilung einer Zeichenfolge über mehrere Zeilen, um die Lesbarkeit zu erhöhen, wenn zunächst einen Wert zu einer Zeichenfolge zuweisen. Ich weiß, dass Zeichenketten unveränderlich sind und daher jedes Mal eine neue Zeichenkette erstellt werden muss. Außerdem sind die Leistungskosten dank der heutigen sehr schnellen Hardware eigentlich irrelevant (es sei denn, man befindet sich in einer teuflischen Schleife). Also zum Beispiel:

String newString = "This is a really long long long long long" +
    " long long long long long long long long long long long long " +
    " long long long long long long long long long string for example.";

Wie gehen die JVM oder der Compiler von .Net und andere Optimierungen damit um? Wird eine einzige Zeichenkette erstellt? Oder wird eine Zeichenkette erstellt, dann eine neue, in der der Wert verkettet wird, und dann eine weitere, in der die Werte erneut verkettet werden?

Das ist nur für meine eigene Neugierde.

3voto

Drew Noakes Punkte 282438

Die entsprechende .NET-AWL zur Ergänzung Antwort von coobird :

Für C#-Code:

string s = "This is a really long long long long long" +
    " long long long long long long long long long long long long " +
    " long long long long long long long long long string for example.";
Console.WriteLine(s);

Eine Debug-Kompilierung erzeugt:

.method public hidebysig static void Main(string[] args) cil managed
{
  .custom instance void [mscorlib]System.STAThreadAttribute::.ctor()
  .maxstack 1
  .locals init (
      [0] string str)
  L_0000: ldstr "This is a really long long long long long long long long long long long long long long long long long  long long long long long long long long long string for example."
  L_0005: stloc.0 
  L_0006: ldloc.0 
  L_0007: call void [mscorlib]System.Console::WriteLine(string)
  L_000c: ret 
}

Wie Sie sehen, handelt es sich also um einen einzigen String.

2voto

cletus Punkte 596503

Solange alle Zeichenfolgen konstant sind (wie in Ihrem Beispiel), wandelt der Compiler in Java (und vermutlich auch in C#) diese in eine einzige Zeichenfolge um.

Sie erhalten nur dann Leistungsprobleme mit +, wenn Sie viele dynamische Zeichenfolgen verketten, z. B. in einer Schleife. In diesem Fall verwenden Sie einen StringBuilder oder StringBuffer.

0voto

Peter Lawrey Punkte 511323

Haftungsausschluss: Dies gilt für Java. Ich würde annehmen, seine wahr für c#

javac erstellt nicht nur einen einzigen String, sondern die JVM verwendet einen String für alle anderen Strings, die denselben Text enthalten.

String a = "He" + "llo th"+ "ere";
String b = "Hell" + "o the"+ "re";
String c = "Hello" +" "+"there";
assert a == b; // these are the same String object.
assert a == c; // these are the same String object.

Hinweis: Sie werden zur Laufzeit dasselbe String-Objekt sein, auch wenn sie in verschiedenen Klassen in verschiedenen JARS sind und von verschiedenen Compilern kompiliert wurden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X