【问题标题】:High Performance Cloning高性能克隆
【发布时间】:2011-10-30 17:00:13
【问题描述】:

我正在寻求一种以高性能方式深度克隆对象图的方法。我将让多个线程非常快速地克隆图形,以便它们可以处理某些状态并在结果不感兴趣时​​丢弃结果,然后返回原始状态再试一次。

我目前正在通过二进制序列化使用深度克隆,虽然它可以工作,但速度并不快。我见过像 protobuf 这样的其他库,但是我的对象图中的类可以在外部程序集中定义,从主程序集中的类继承,并且如果可能的话,不希望在这些消费程序集中增加任何复杂性。

我遇到的一件有趣的事情是使用automatically generated IL 进行克隆。好像还没有完成,我已经发布了,看看作者是否做了更多的工作,但我猜没有。有没有其他人开发或看到过一种更完整的通过 IL 进行深度克隆的方法?还是其他更快的方法?

【问题讨论】:

  • 编辑:糟糕,我阅读失败。
  • @Tejs:如果您阅读了问题,他正在使用它
  • 你对图结构有什么特别的了解吗?例如,分支可以引用其他分支吗?你能假设某种平衡的、正常的结构结构(例如:二叉树)吗?
  • @Paul:完整的图表将有跨分支的引用,尽管我可以很容易地隔离这一点。那时我相信任何交叉引用都可以被忽略和复制,因为它们没有任何状态。我可能会尝试制作一个示例图并上传它。

标签: c# clone il


【解决方案1】:

除了序列化,我只考虑三个选项:

  • 坚持序列化,但要定制它。如果您想以声明方式对内容进行分类,并且很有可能获得性能提升,这可能会很有用。
  • 基于反射的对象行走,与 Fasterflect 等 IL 发射器结合使用。
  • 代码生成或通过将属性相互分配来编写您自己的克隆(我们有一些旧代码为此使用我们称之为复制构造函数的东西,获取自身的实例并手动复制属性/字段) .

我们有一些控制二进制序列化的代码实例,以便我们可以序列化一个实习 GUID 表(我们有很多重复的 GUID 并通过 .NET Remoting 序列化非常大的列表)。它对我们很有效,我们不需要第三方序列化框架,但是,它是带有一点代码生成的手工制作的东西。

CSLA.NET framework 具有一个名为 UndoableBase 的类,它使用反射来序列化 Hashtable 的属性/字段值。用于允许对内存中的对象进行回滚。这可能适合您的“返回原件再试一次”的句子。

我个人会进一步研究基于反射的解决方案(最好使用发射的 IL 以获得更好的性能),这样您就可以利用类/成员属性来控制克隆过程。如果性能为王,这可能不会削减它。

【讨论】:

  • Adam:自己的克隆,虽然我觉得会提供相当多的维护开销,自定义序列化也是如此(但对于明显的建议 +1)。您能否提供有关 Fasterflect 建议的更多详细信息?
  • @Ian 我建议将 Fasterflect 作为基于反射的解决方案的补充,我相信它需要您在反射中尝试做的事情并在第一次调用时直接发出 IL 来完成任务,因此后续调用更快。至于手动复制,可以通过开发一个简单的代码生成工具将复制构造函数输出到您希望克隆的类的部分类中来减轻维护。
  • @Ian 我们使用代码生成工具来遍历字段/属性并输出“读/写”对以进行序列化和反序列化。唯一的维护是确保在类更改时使用这些工具。但是,我们不是用于克隆,而是用于 .NET Remoting 支持。但想法是一样的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-27
  • 2015-09-01
  • 1970-01-01
相关资源
最近更新 更多