【问题标题】:Binary serialization slow (sometimes) in .NET 4.6.NET 4.6 中的二进制序列化缓慢(有时)
【发布时间】:2015-08-28 12:06:37
【问题描述】:

我最近将我机器上的 .NET 框架升级到 .NET 4.6,并注意到从/到文件的二进制(反)序列化对象的时间有很大差异。

例如,我有一个 10MB 的文件,它在我的机器上使用 .NET 4.5.2 在大约 2 秒内被反序列化。升级到 .NET 4.6 后最多需要 50 秒(!) - 实际时间非常随机:有时需要 2 秒,有时需要 50 秒(相同的文件,相同的程序,甚至相同的进程)。

有没有其他人注意到类似的行为并且可能找到了解决此问题的解决方法(或解决方案)?

【问题讨论】:

  • 你能用代码证明你的说法吗? “有时某些东西不起作用”的问题可能会被关闭。在提问之前,您在研究方面付出了哪些努力?
  • 好吧,我的程序非常复杂(我序列化具有数百个字段的对象),但我会尝试找到一个较小的问题示例。我试图找到与 .NET 4.6 相关的更改(或问题)的任何信息,但到目前为止我还没有找到任何信息(尽管有证据表明 .NET 4.6 的 RyuJIT 中存在一些严重问题,所以序列化问题可能是也有某种相关性)
  • 你在(反)序列化类或结构吗?
  • 您需要创建一个原型来序列化和反序列化该 10mb 文件,看看是否可以重现缓慢。如果可以,请向 microsoft 提交有关它的连接,因为它可能是一个错误。
  • ... 我们在工作中遇到了以下问题:x86 不受影响,但 x64 是。问题是我们并行反序列化了很多类(不是结构)。我们与 Microsoft 取得了联系,他们提出了一些解决方法:(a)将您正在(反)序列化的项目更改为结构,(b)创建序列化代理,将 ISerializationSurrogate 实现为 shim 以允许将类序列化为结构。如果我的情况听起来很熟悉,我们来自 Microsoft 的反馈是,这是 4.6 中的一个问题,但可以在 4.6.1 中修复。

标签: c# .net


【解决方案1】:

没有理由假设它与二进制序列化有任何关系,它是非常确定的。鉴于随机行为以及您可能会用 10 兆字节的文件大量戳垃圾收集器的可能性,一个非常好的候选者是 this bug。很牛逼。

如果您有良好的重现,则使用新的诊断工具查看任何慢速 1 代集合。并修补 GCSettings.LatencyMode,如果它有影响,那么你就知道这是根本原因。应该很快就会修复。

【讨论】:

  • 感谢您的提示。我添加了一个线程来监控在 GC 中花费的时间百分比。事实证明,在这些关键位置(反序列化期间/之后),99% 的时间都花在了 GC 上(使用默认设置)。当我更改为 GCLatencyMode.LowLatency 时,它不再阻塞,GC 时间百分比约为 50% 左右。
  • 通灵调试得一分。
  • 喜欢阅读这样的答案。这将问题确定为一种症状,并以解决实际问题的方法来回答。
【解决方案2】:

我们在反序列化对象时遇到了与 BinaryFormatter 完全相同的问题。正如我们观察到的,这是由于框架 4.6 中的一个错误,该错误在框架 4.6.1 中得到解决。更改列表位于here。有问题的错误是改进了并行二进制文件反序列化的性能 [141896]

【讨论】:

  • 对于我们的应用程序 4.6.1 没有解决性能缓慢的问题,不得不回滚到 .net 4.5.2
  • @Oldfart 正如你我们使用的 4.5.2 - 正常,4.6 非常慢,4.6.1 又正常。
猜你喜欢
  • 2023-03-20
  • 2013-08-16
  • 1970-01-01
  • 2011-06-05
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
  • 2014-01-04
  • 1970-01-01
相关资源
最近更新 更多