2017-11-03 4 views
-2

Welcher der folgenden Anrufe weist mehr Müll zu?Was weist mehr zu, Boxen paramaters oder params array?

void LogParams(string format, params object[] args) 
{ 
} 

void LogArgs(string format, object arg0, object arg1, object arg2) 
{ 
} 

LogParams("Hello, {0}, {1}, {2}", "Tom", "Dick", "Harry"); 
LogArgs("Hello, {0}, {1}, {2}", "Tom", "Dick", "Harry"); 

Hintergrund ist darüber nachdachte, wie ich Log-Meldungen zu optimieren, die schließlich zu string.Format einkochen() ruft jedoch viele der Protokollmeldungen schließen sich im Wesentlichen nur Strings zusammen.

+4

Eine 'Zeichenfolge' ist bereits ein Referenztyp; Da ist kein Boxing involviert. – xxbbcc

+3

Aber wenn Sie wissen möchten, was mehr Müll erzeugt, profilieren Sie die zwei Schnipsel und finden Sie heraus. – Servy

+0

Ah Entschuldigung, ja, verwechsle mein Verständnis über das Boxen. – JimmyDeemo

Antwort

0

Zunächst einmal ist kein Boxing beteiligt, da string kein Werttyp ist.

Die erste Methode verbraucht mehr Speicher, da ein Array mit drei Elementen erstellt werden muss (eines für jede String-Referenz). Dann wird jede Zeichenfolge erstellt und die Referenzen werden dem Array zugewiesen. Bevor die Methode aufgerufen wird, wird die Array-Referenz auf den Stapel geschoben.

Bei der anderen Methode werden nur die drei Strings auf dem Heap erstellt. Die Referenzen werden direkt vor dem Aufruf der Methode in den Stack geschoben.

Sie sparen grundsätzlich Platz auf dem Stapel und sparen Speicherplatz auf dem Heap. Aber die Array-Erstellung ist teurer (da es zusätzlich ist).

+0

Ja, ich sehe das alles jetzt. Ich habe mich hauptsächlich über Saiten verwirrt, denke also, dass ich da durcheinander gekommen bin, danke für die Antwort. – JimmyDeemo