2014-07-10 131 views
1

I'have約30 000對象爲二進制序列化文件, 我用一個簡單的foreach循環這個基本的代碼來做到這一點:二進制文件生成性能

FileStream fileStream = new FileStream(pathToFile, FileMode.Create); 
BinaryFormatter binaryFormatter = new BinaryFormatter(); 
binaryFormatter.Serialize((Stream) fileStream, objectToSerialize); 
fileStream.Close(); 

我可以加速突未使用多線程或其他方式? (內存流等)

+2

我會假設磁盤訪問是放緩的因素。 –

+0

如果每個對象的序列化是獨立的,並被寫入一個獨特的文件,那麼你可以簡單地使用一個並行的foreach循環,但我猜測瓶頸是IO而不是處理。 – Dirk

+1

請參閱[this](http://stackoverflow.com/questions/902425/does-multithreading-make-sense-for-io-bound-operations) –

回答

3

重新使用binaryFormatter,而不是每次重新創建它。在FileStream和格式化程序之間使用BufferedStream也可能會提高性能。 順便說一句:使用「使用」來確保您的文件流已關閉,即使在序列化時引發異常。

+0

好的,我會測試它,我實際上使用「使用」,但我沒有把完整的代碼。 thx –

+1

@ChristopheDebove不希望有驚人的性能提升。正如所有人都指出的那樣,您的主要問題是磁盤訪問 –

+0

正如我所說我不真的有性能問題,我只是想了解我的代碼^^涉及的概念。 –

1

您將「擠壓」一些涉及IO的改進性能的唯一方法是確保您在進行CPU處理時不會等待IO。但是,您不能並行寫入磁盤。它一次只能執行一項操作。

所以兩個大的事情你可以做的是:

  1. 確保你不寫的小(幾字節)塊。相反,在內存中建立一個緩衝區,然後將全部內容寫入磁盤。這將減少您正在執行的實際磁盤寫入次數(這非常緩慢)。
  2. 寫入磁盤時,您可能正在構建下一個塊(請參見#1),以便在磁盤寫完一個塊時,它可以立即寫入另一個塊。這可以用許多方案來完成,但一個流行的方案是有兩個線程,一個用於創建塊,另一個用於寫入磁盤。第一個線程寫入隊列,另一個隊列出隊。
相關問題