ste*_*e_c 3 c# performance clone deep-copy
我们有一个应用程序,它对数据对象进行比较,以确定对象的一个版本是否与另一个版本不同.我们的应用程序还对这些对象进行了一些广泛的缓存,在进行这些比较时,我们遇到了一些性能问题.
这是工作流程:
这里有几个问题.
主要问题是我们的深度克隆方法非常昂贵.我们对浅色克隆进行了分析,速度慢了10倍.那是废话.这是我们深度克隆的方法:
public object Clone()
{
using (var memStream = new MemoryStream())
{
var binaryFormatter = new BinaryFormatter(null, new StreamingContext(StreamingContextStates.Clone));
binaryFormatter.Serialize(memStream, this);
memStream.Seek(0, SeekOrigin.Begin);
return binaryFormatter.Deserialize(memStream);
}
}
Run Code Online (Sandbox Code Playgroud)
我们最初使用以下内容进行克隆:
public object Clone()
{
return this.MemberwiseClone();
}
Run Code Online (Sandbox Code Playgroud)
这样做效率更高,但是因为它做了浅层克隆,所有复制对象(这些对象的属性,如字典等)都没有被克隆.该对象仍将包含与缓存中的对象相同的引用,因此在比较时属性将相同.
那么,有没有人有一种有效的方法在C#对象上进行深度克隆,这将克隆整个对象图?
如果没有在需要克隆的所有数据对象上明确地实现ICloneable,那么您将无法比通用二进制序列化更好.另一种可能的路线是反射,但如果您正在寻找性能,您将不会满意.
我会考虑与ICloneable命中深拷贝和/或IComparable的比较,如果对象是不同的...如果性能是大到你一个问题.