2013-01-09 1 views
9

Dieser Code dauert ca. 8 Sekunden mit einem Strom 65K, die etwa von einem Blob in einer DatenbankWarum ist das Kopieren eines Stroms und dann schneller eine BinaryFormatter Deserialisieren mit als nur Deserialisieren

private string[] GetArray(Stream stream) 
{ 
    BinaryFormatter binaryFormatter = new BinaryFormatter(); 
    object result = binaryFormatter.Deserialize(stream); 
    return (string[])result; 
} 

Dieser Code dauert ein paar Millisekunden kommen :

private string[] GetArray(Stream stream) 
{ 
    BinaryFormatter binaryFormatter = new BinaryFormatter(); 
    MemoryStream memoryStream = new MemoryStream(); 
    Copy(stream, memoryStream); 
    memoryStream.Position = 0; 
    object result = binaryFormatter.Deserialize(memoryStream); 
    return (string[])result; 
} 

Warum?

+0

In welche Art von Stream gehen Sie hinein? –

+0

Es ist der Strom, den ich von oracleReader.GetOracleBlob (col) oder sqlDataReader.GetSqlBytes (col) .Stream bekomme. Es verhält sich genauso. Die Oracle-Implementierung ist etwas schneller als für SQL Server. –

+0

Verwenden Sie einen Profiler. Ich vermute schlechte Messung. Vielleicht macht der erste den Cache so stark, dass der zweite schnell ist. Wechseln Sie die Bestellung. Nimm auch die Datenbank aus der Gleichung. – usr

Antwort

5

Sie sagen also das Problem verschwindet, wenn die Datenbank aus der Gleichung herausgenommen wird. Hier ist meine Theorie:

BinaryFormatter liest aus dem Stream in winzigen Schritten. Es hat so wenig wie möglich zu lesen, so dass es nicht versehentlich ein paar Bytes nach das serialisierte Objekt schlucken. Das heißt, es gibt Tonnen von Lesebefehlen aus (ich habe dies mit Reflector verifiziert).

Wahrscheinlich führt jedes Lesen des Blob-Streams zu einem Netzwerk-Roundtrip (oder einem anderen großen Overhead). Das gibt Ihnen Millionen von Roundtrips, wenn Sie sofort BinaryFormatter verwenden.

Durch die Pufferung wird das Netzwerk effizienter genutzt, da die Größe des Lesepuffers viel größer ist.

+1

Ich habe versucht, die Puffergröße in der Copy-Methode auf 1 zu setzen und tatsächlich war es wieder sehr langsam. So scheint es, dass deine Theorie richtig ist. Gut, eine Antwort zu bekommen, vielen Dank. –

Verwandte Themen