möchte MemoryStream wiederverwenden

7

Mein Code verwendet MemoryStream zum Serialisieren / Deserialisieren von Objekten zum / vom Netzwerk. Ich würde gerne einen einzelnen MemoryStream in meiner Klasse verwenden, anstatt jedes Mal ein neues zu erstellen etwas über den Draht senden.

Weiß jemand, wie man das macht?

Codeausschnitt:

%Vor%

Danke!

    
Jacko 07.01.2011, 19:53
quelle

2 Antworten

8

Zuerst hat Ihre serialize-Methode einen Fehler:

  

Beachten Sie, dass der Puffer zugeordnete Bytes enthält, die möglicherweise nicht verwendet werden. Wenn beispielsweise die Zeichenfolge "test" in das MemoryStream-Objekt geschrieben wird, beträgt die Länge des von GetBuffer zurückgegebenen Puffers 256, nicht 4, wobei 252 Byte nicht verwendet werden. Verwenden Sie die ToArray-Methode, um nur die Daten in dem Puffer zu erhalten; ToArray erstellt jedoch eine Kopie der Daten im Speicher.

d. Die Array-Returns sind größer als die serialisierten Daten

Für die Deserialisierung können Sie einen Speicherstream erstellen, der das übergebene Array verwendet, so dass keine internen Puffer zugewiesen werden. Aber es sei denn, Sie haben Benchmarks, die zeigen, dass die Speicher-Stream-Zuweisung wirklich ein Flaschenhals ist, würde ich nicht stören.

Wenn Sie Ihre Speicherzuweisungen wirklich optimieren möchten, müssen Sie die byte[] Puffer wiederverwenden. Dies bedeutet insbesondere, dass die API so geändert wird, dass sie mit Teilbereichen von Arrays arbeitet, so dass die Größe der Nachricht und die Array-Größe nicht identisch sein müssen.

Im Folgenden sind Implementierungsdetails aufgeführt, die sich jederzeit ändern können (und möglicherweise bereits geändert haben, seit ich darüber gelesen habe):
Es lohnt sich sicher nicht, wenn die Puffer nicht auf dem großen Objekt-Heap enden. Wenn die Objekte klein sind, werden sie in der nächsten Gen0-Sammlung günstig gesammelt. Der große Objekt-Heap endet dagegen direkt in Gen2. AFAIR-Objekte & gt; 250kB sind dort zugeordnet.

Und natürlich kann die Wiederverwendung der Puffer, ohne sie jemals zu verkleinern, ein Speicherleck sein.

    
CodesInChaos 07.01.2011, 20:08
quelle
12

Wenn Sie MemoryStream wiederverwenden, erhalten Sie keinen Leistungsvorteil.

Es gibt einen Grund, warum MemoryStream nicht eindeutig ist. Weil es teurer wäre, es zu löschen, als ein neues zu erstellen.

Wenn Sie sich die Interna der Klasse ansehen, sehen Sie, dass sie einen Puffer zuweist, und wenn sie schreibt, wenn ihr Puffer voll ist, weist sie einen neuen Puffer zu und kopiert existierende Bytes und fährt dann fort. In gewisser Weise ist der Puffer also unveränderlich.

Dies kann hier an der Einstellung der Kapazität gesehen werden, die zum Zeitpunkt des Schreibens von EnsureCapacity() aufgerufen wird:

%Vor%     
Aliostad 07.01.2011 20:00
quelle

Tags und Links