我们使用MemoryStream来做深度复制,但效率非常低,任何改进的方法

本文关键字:效率 非常低 方法 任何改 复制 MemoryStream 深度 我们 | 更新日期: 2023-09-27 18:37:14

我们使用以下代码来深度复制一个 Element obj,代码将被执行数千次(复制数千个不同的元素),这需要我们花费大量时间(约 1 分钟)

public static Element Clone(Element me)
    {
        MemoryStream stream = new MemoryStream();
        try
        {
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(stream, me);
            stream.Seek(0, SeekOrigin.Begin);
            return (Element)formatter.Deserialize(stream);
        }
        finally
        {
            stream.Close();
        }
    }

我们如何提高性能?

我们使用MemoryStream来做深度复制,但效率非常低,任何改进的方法

为了获得最佳性能,请为每个类实际实现 Clone 方法。当然,这使得维护成本更高 - 另一方面,它消除了一部分发生的魔力,许多开发人员会对实际的任务列表感到更舒服。

另一种方法是使用 System.Reflection 实现您自己的克隆魔法,以识别要克隆的成员,并使用 Reflection.Emit 为每个类生成特定的 IL。

虽然我个人会选择第二种选择,但它确实引入了自己的复杂性,因此对某些人来说会再次感觉像魔术。我已经成功地实现了类似的解决方案来克隆对象树,这些对象树的类型我无法更改自己(并且不可序列化)