Frage

Ist Zeichenfolge Unveränderlichkeit Arbeit durch Anweisung oder durch Strings innerhalb einer Anweisung?

Zum Beispiel, ich verstehe, dass der folgende Code zwei Strings auf dem Heap zugewiesen werden.

string s = "hello ";
s += "world!";

„Hallo“ wird auf dem Heap bleiben, bis Müll gesammelt; und s jetzt Referenzen „Hallo Welt!“ auf dem Heap. Doch wie viele Strings zuteilt die folgende Zeile auf dem Heap ... 1 oder 2? Auch ist es ein Tool / Weg, um die Ergebnisse zu überprüfen?

string s = "goodbye " + "cruel world!";
War es hilfreich?

Lösung

Der Compiler hat eine spezielle Behandlung für die String-Verkettung, weshalb das zweite Beispiel immer nur ist ein string. Und bedeutet „Internierung“, dass selbst wenn Sie diese Zeile 20000 mal laufen gibt es immer noch nur 1 String.

Re die Ergebnisse zu testen ... die einfachste Art und Weise (in diesem Fall) ist wahrscheinlich in Reflektor aussehen:

.method private hidebysig static void Main() cil managed
{
    .entrypoint
    .maxstack 1
    .locals init (
        [0] string s)
    L_0000: ldstr "goodbye cruel world!"
    L_0005: stloc.0 
    L_0006: ldloc.0 
    L_0007: call void [mscorlib]System.Console::WriteLine(string)
    L_000c: ret 
}

Wie Sie (ldstr) sehen können, hat der Compiler dies für Sie bereits getan.

Andere Tipps

Literal Strings werden diese Internierung bedeutet, dass "hello " tut nicht residieren auf dem Heap, sondern im Datensegment [siehe Kommentar] des Progamm (und ist somit nicht für die Garbage collection förderfähig), gleiche gilt für "world", wie "hello world", die interniert werden kann auch, wenn die Compiler ist intelligent genug.

"goodbye cruel world" wird seit Stringliteral Verkettung interniert wird vom Compiler etwas behandelt.


Edit: Ich bin mir nicht sicher über die Datensegmentrechnung finden Sie unter diese Frage für weitere Informationen.

Eigentlich wahrscheinlich 3. a const String für "Auf Wiedersehen", eine const String für "grausame Welt", und dann wird eine neue Zeichenfolge für das Ergebnis.

Sie können sicher herausfinden, indem auf den generierten Code suchen. Es hängt von der Compiler (und in der Tat, auf der Sprache, dann ist dies nicht offensichtlich), aber Sie können die Ausgabe von g ++ unter Verwendung des Flag -a (ich glaube, überprüfen Sie die man-Seite) bekommen den Zwischencode lesen .

Vertrauen Sie nicht, was Sie „Wissen“ über Saiten. Sie könnten den Quellcode für die Umsetzung der Zeichenfolge schauen. Zum Beispiel Ihres Beispiel:

string s = "goodbye " + "cruel world!";

In Java würde einen einzelnen String zuweisen. Java spielt ein paar ziemlich nette Tricks und wäre schwer zu überlisten - nur nie optimieren, bis Sie müssen

Zur Zeit jedoch, soweit ich weiß, mit dieser:

String s="";
for(int i=0;i<1000;i++)
    s+=" ";

einen 1000 Raum-String erstellen neigt immer noch extrem ineffizient sein

in einer Schleife Anfügen ist ziemlich schlecht, aber ansonsten ist es wahrscheinlich so effizient wie Stringbuilder.

Hier vorsichtig sein, da der Compiler einige sehr unterschiedliche Optimierungen vornehmen kann, wenn der Zeichenfolge-Wert zum Zeitpunkt der Kompilierung bekannt ist. Wenn die Saiten Sie verwenden erst zur Laufzeit (gezogen aus einer Konfigurationsdatei, eine Datenbank oder eine Benutzereingabe) bekannt Sie einige sehr unterschiedliche IL sehen werden.

Wenn Sie vorhaben, nur ein oder zwei String-Verkettungen zu tun, würde ich nicht darum kümmern.

Wenn Sie jedoch haben viele Verkettungen, oder Sie haben eine Schleife, dann möchten Sie auf jeden Fall Vorkehrungen treffen. In der Java-Welt, die bedeutet, verwenden Sie String insteads von String verketten.

Wenn es in einer Zeile nicht nur ist, kann die Verkettung von zwei Strings, indem der erste String in einen String erreicht werden, tun die Verkettung und Rückführen der Ergebniszeichenfolge.

Erstellen der String selbst mag übertrieben erscheinen, aber das ist, was ohnehin passieren wird .-

Mit allen Mitteln nicht vorzeitig optimieren, aber nicht Rabatt, wie schlecht performanter String concatonations sein kann. Es ist nicht die Objekterstellung, aber die GC Arbeit, die sie verursacht.

Es gibt ein Labor auf (ASP.NET Escalation Engineer) Blogs Tess Ferrnandez, die eine Show (ziemlich extrem, gewährt) Beispiel: wie String concatonation bringen kann einen Server in die Knie .

Wenn der Compiler „intelligent“ ist, wird es nur eine Saite sein mit „Auf Wiedersehen grausame Welt!“

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top