2013-01-09 31 views
9

此代碼需要大約8秒,約含65K流從一個blob來在數據庫爲什麼複製流,然後使用BinaryFormatter的不僅僅是反序列化

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

此代碼需要幾毫秒快反序列化:

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

爲什麼?

+0

你傳入什麼樣的流? –

+0

這是我從oracleReader.GetOracleBlob(col)或sqlDataReader.GetSqlBytes(col).Stream獲得的流。它的行爲相同。 oracle實現比sql server快一些。 –

+0

使用分析器。我懷疑測量不好。也許第一個填充緩存,所以第二個很快。切換訂單。另外,從數據庫中取出數據庫。 – usr

回答

5

所以你說這個問題在數據庫取出等式時消失了。這是我的理論:

BinaryFormatter以微小的增量從流中讀取數據。它已經儘可能少地讀取,以致它不會意外地吞下之後的幾個字節之後的序列化對象。這意味着它發出噸的讀取命令(我用反射器驗證了這一點)。

可能每次讀取blob流都會導致網絡往返(或其他主要開銷)。如果馬上使用BinaryFormatter,那麼這將帶來數百萬次往返。

緩衝首先會導致網絡被更有效地利用,因爲讀緩衝區的大小要大得多。

+1

我試着在Copy方法中將buffersize設置爲1,果然,它又很慢了。所以看來你的理論是正確的。很高興得到答案,非常感謝。 –

相關問題