2009-04-18 12 views
0

Ich lese gerade C# in Tiefe von Jon Skeet und habe über Wert und Referenztypen gelesen.Leistung der Übergabe von vielen Werttypen in Parameter

Es hat mich über die Kosten der Verwendung von Werttypen als Methodenparameter aufgrund dieser Wert kopiert, wenn sie übergeben werden. Während diese Kosten bei der Betrachtung von ganzen Zahlen nicht viel sind, was wäre, wenn diese Wertparameter Strings wären, die mehrmals herumgereicht wurden.

Wäre es sinnvoll, eine StringBuilder-Klasse zu verwenden und sie anstelle eines String-Typs zu übergeben?

Wenn Sie bedenke, dass die Zeichenfolge lang war, sagen Sie 1024 Zeichen und wurde sogar nur wenige Male zwischen Methoden übergeben, kontrastieren Sie das mit einem StringBuilder mit dem gleichen Wert, der den Wert der Referenz 4 übergeben würde oder 8 Bytes jedes Mal, könnten Sie eine erhebliche Leistungsverbesserung haben.

Diese Frage kann auch einen wichtigen Teil des Verständnisses hervorheben, das ich bezüglich des String-Typs vermisse, bitte geben Sie dies bei Bedarf an.

Welche Auswirkung hätte dies auf die Garbage Collection in Bezug auf die Strings in jedem Fall?

Edit: Anscheinend habe ich eine wichtige Information über Strings vergessen, die die Frage null und nichtig macht. Danke Grover.

Antwort

8

Zeichenfolge ist kein Werttyp, sie sind nur unveränderliche Objekte.

Das Übergeben eines Strings verursacht die gleichen Kosten wie jedes andere Objekt: Die Größe seines Verweises, der auf Win32 4 Byte beträgt.

Ein weiterer Hinweis: Der Werttyp Semantik (durch Wertübergabe) kann vom Compiler in optimierter Weise implementiert werden. Ich habe mir nicht angeschaut, wie das MS JIT es macht, aber es kann sicherlich immer noch nur einen Zeiger darauf senden und vom Ziel verlangen, beim Schreiben eine Kopie zu machen.

Dies werden wir im Managed Operating System Alliance JIT/AOT Compiler machen.

Verwandte Themen