繁体   English   中英

高性能克隆

[英]High Performance Cloning

我正在寻找一种以性能方式深度克隆对象图的方法。 我将有多个线程非常快速地克隆图形,以便它们可以在某种状态下玩耍并在不感兴趣的情况下丢弃结果,返回原始状态再试一次。

我目前正在通过二进制序列化使用深层克隆,尽管它可以工作,但运行速度并不惊人。 我已经看过其他像protobuf这样的库,但是我的对象图中的类可能是在外部程序集中定义的,它们是从主程序集中的类继承的,并且不希望在可能的情况下增加那些使用这些程序集的复杂性。

我遇到的有趣的事情之一是使用自动生成的IL进行克隆。 似乎还没有完成,我已经发布了帖子,以查看作者是否对此做了更多操作,但我想还没有。 是否有其他人开发或看到了通过IL进行深度克隆的功能更全的方法? 还是另一种快速的方法?

除了序列化之外,我仅考虑三个选项:

  • 坚持序列化,但要对其进行自定义。 如果您要声明性地对内容进行分类,并且很有可能获得性能提升,这可能会很有用。
  • 基于反射的对象遍历,以及IL发射器(如Fasterflect)
  • 通过从字面上分配属性来相互代码分配代码或编写自己的克隆(我们有一些旧代码为此使用所谓的复制构造函数,并获取其自身的实例并手动复制属性/字段)。

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

CSLA.NET框架具有一个称为UndoableBase的类,该类使用反射序列化属性/字段值的Hashtable表。 用于允许回滚内存中的对象。 这可能与您的“返回原图重试”句子相符。

我个人将进一步研究基于反射的(最好使用发出的IL,以提高性能),然后,您可以利用类/成员属性来控制克隆过程。 如果性能为王,那可能就不行了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM