gpt4 book ai didi

c# - 更快的深度克隆

转载 作者:IT王子 更新时间:2023-10-29 04:32:53 24 4
gpt4 key购买 nike

有没有人想要一个允许我按值克隆 .Net 对象的框架/类?我只对公共(public)读/写属性(即 DataContracts)感兴趣,我不关心引用是否被正确解析(即包含两次相同项目实例的集合)。

我通过 DataContractSerializer 尝试了序列化技巧(序列化为 XML 并返回),编写了基于反射的克隆类(有时更快/有时更慢),并且想知道是否有人编写了一个可以做的辅助类这是通过 Emit 而不是反射。至于现在发射 IL 对我的小脑袋来说有点太多了,但我想这将是最终的解决方案。除非有人知道比 DataContractSerializer 更快的替代方法。

最佳答案

前段时间写了三个.NET的深度克隆方法:

  • 一个使用众所周知的 BinaryFormatter 技术(尽管我对其进行了调整,以便对象不需要可序列化即可被克隆)。这是迄今为止最慢的。

  • 第二次我使用了纯反射。它至少比使用 BinaryFormatter 克隆快 6 倍。这个也可以用于 Silverlight 和 .NET Compact Framework。

  • 第三个使用 Linq 表达式树(用于运行时 MSIL 生成)。它比 BinaryFormatter 技术快 60 倍,但第一次遇到每个类时的设置时间约为 2 毫秒。

Logarithmic scale illustrating cloning performance

横轴显示克隆对象的数量(尽管每个克隆对象都包含多个嵌套对象)。

BinaryFormatter 在图表中被标记为“Serialization”。数据系列“Reflection”是一个自定义系列,它通过 GetField()/SetField() 复制字段。

我在这里将所有三种克隆方法作为开源发布:

http://blog.nuclex-games.com/mono-dotnet/fast-deep-cloning/

关于c# - 更快的深度克隆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/852064/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com