克隆性能更佳

Moh*_*bet 11 c#

我想创建深度复制方法,我找到了3种方法来执行它

1个深度复制,每个属性1乘1

2 - 使用反射

3 - 使用序列化

请他们哪个是表现最好的

Ree*_*sey 13

手动深度复制您的值的第一个选项将是迄今为止最高效的.

反射将引入相当多的开销,因为它(相对)访问数据很慢.

序列化增加了巨大的成本,因为它将数据序列化为临时结构,然后反转要设置的进程.这又是非常缓慢的.

选项2或3的唯一优势是它可能更容易实现,并且可以跨多种类型重用.第一个选项必须是每种类型的手写,但速度要快得多(内存使用效率也高于选项3).


fra*_*kon 10

我用三种方法和表达式树方法进行了比较.

在此输入图像描述

对于大量对象,反射快5倍,手动代码和表达式树比序列化快20倍.因此,性能最佳的是手动代码和表达式树.

链接到使用过的克隆代码(2.-4.用作扩展方法):

  1. 手动:手动编写,无链接.
  2. 通过序列化克隆
  3. 通过反思克隆
  4. 通过表达式树克隆

  • 使用您发布的表达式树克隆代码 https://www.codeproject.com/Articles/1111658/Fast-Deep-Copy-by-Expression-Trees-C-Sharp?fid=1907758&select=5469139&fr=1&tid=5467411,是使用较新版本的 .Net 框架失败并出现安全异常,**操作可能会破坏运行时**,这基本上是由于格式错误的表达式树导致的异常,用于在运行时生成 Func,请检查您是否有一些解决方案。事实上,我只看到层次结构很深的复杂对象的问题,简单的很容易被复制 (2认同)

HAB*_*JAN 7

订购您列出的可能解决方案是正确的性能订单.

编写代码以手动克隆每个属性值时,您将获得最佳性能.

反射将具有与手动克隆类似但稍慢的结果.

序列化是最糟糕的情况.但最快实施.

这是一篇描述其他可能解决方案的好文章.

所以这里列出了所有可能的克隆方法:

  1. 手动克隆
  2. 使用MemberwiseClone进行克隆
  3. 用反射克隆
  4. 克隆序列化
  5. 用IL克隆
  6. 用扩展方法克隆

我个人会选择" 克隆与IL ",因为它比反射快一点,你不必手动克隆一切.