2013-01-09 5 views
9

Questo codice richiede circa 8 secondi con un flusso contenente circa 65K proveniente da un blob in un databasePerché la copia di un torrente e poi deserializzazione utilizzando un BinaryFormatter più veloce di appena deserializzazione

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

Questo codice richiede pochi millisecondi :

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; 
} 

Perché?

+0

Che tipo di flusso passi? –

+0

È lo stream che ottengo da oracleReader.GetOracleBlob (col) o sqlDataReader.GetSqlBytes (col) .Stream. Si comporta allo stesso modo. L'implementazione di Oracle è leggermente più veloce rispetto a SQL Server. –

+0

Utilizzare un profiler. Sospetto cattiva misurazione. Forse il primo carica la cache così il secondo è veloce. Cambia l'ordine. Inoltre, estrai il database dall'equazione. – usr

risposta

5

Quindi si dice che il problema scompare quando il database viene estratto dall'equazione. Ecco la mia teoria:

BinaryFormatter letture dal flusso in piccoli incrementi. Lo ha il leggere il meno possibile in modo che non inghiottisca accidentalmente alcuni byte dopo l' dell'oggetto serializzato. Ciò significa che sta emettendo tonnellate di comandi di lettura (l'ho verificato con Reflector).

Probabilmente, ogni lettura del flusso di blob sta causando un roundtrip di rete (o qualche altro overhead principale). Che ti dà milioni di roundtrip se si utilizza subito BinaryFormatter.

Il buffer per prima causa l'utilizzo della rete in modo più efficiente poiché la dimensione del buffer di lettura è molto più grande.

+1

Ho provato a impostare il buffersize su 1 nel metodo Copy e, in effetti, è stato molto lento. Quindi sembra che la tua teoria sia corretta. Buono a ricevere una risposta, grazie mille. –

Problemi correlati