2015-08-28 52 views
5

我最近將我的機器上的.NET框架升級到了.NET 4.6,並且注意到二進制(反)序列化對象從/到文件的時間差別很大。在.NET 4.6中,二進制序列化速度很慢(有時候)4.6

例如,我有一個10MB的文件,這個文件在我的機器上用.NET 4.5.2進行了大約2秒的反序列化。升級到.NET 4.6後需要50秒(!) - 實際時間非常隨機:有時需要2秒,有時需要50秒(相同的文件,相同的程序,甚至相同的進程)。

是否有其他人注意到類似的行爲,並可能找到解決方法(或解決方案)這個問題?

+7

你能用代碼證明你的陳述嗎? 「有時候某些東西不行」的問題可能會被封閉。在問之前你在研究中做了什麼努力? – netaholic

+0

嗯,我的程序非常複雜(我用數百個字段序列化對象),但我會嘗試找到一個較小的問題示例。 我試圖找到任何關於與.NET 4.6有關的變化(或問題)的信息,但到目前爲止我還沒有找到任何信息(儘管有證據表明.NET 4.6的RyuJIT存在一些嚴重問題,所以也許序列化問題是以某種方式相關的) – Bartek

+0

你是(德)序列化類或結構? –

回答

4

認爲它與二進制序列化有關的一點理由,它非常確定。考慮到隨機行爲和可能性,你會用10兆字節的文件狠狠地撥動垃圾收集器,非常好的候選者是this bug。真是太麻煩了。

如果你有一個很好的repro,然後使用新的診斷工具來查看任何緩慢的gen#1集合。並修改GCSettings.LatencyMode,如果它有一個影響,那麼你知道它是根本原因。應該儘快解決。

+0

感謝您的這種提示。我添加了一個監視GC時間百分比的線程。事實證明,在這些關鍵的地方(反序列化期間/之後),99%的時間花費在GC中(使用默認設置)。 當我更改爲GCLatencyMode.LowLatency時,它不再被阻塞,GC時間的百分比爲50%左右。 – Bartek

+1

精神調試得分1。 –

+0

喜歡閱讀這樣的答案。這將問題確定爲一種症狀,並通過對實際問題的解決方案進行回答。 – jgauffin

0

當反序列化對象時,我們遇到了與BinaryFormatter完全相同的問題。正如我們所觀察到的,這是由於框架4.6中的一個錯誤而導致的,該錯誤在框架4.6.1中解決。發現更改列表爲here。有問題的錯誤是並行二進制文件反序列化的改進性能[141896]

+0

對於我們的應用程序4.6.1沒有解決慢性能不得不回滾到.net 4.5.2 –

+0

@Oldfart正如你我們使用4.5.2 - 正常,4.6非常慢,4.6.1再次正常。 – participant