这里有很多关于 MemberwiseClone 的问题,但我找不到任何准确的内容。
据我了解,MemberwiseClone 基本上只是复制对象的内存区域,将其转储到其他地方,然后将其称为该对象的新实例。显然非常快,对于大型对象来说,这是制作副本的最快方法。对于具有简单构造函数的小对象,创建实例并复制各个属性会更快。
现在,我有一个使用 MemberwiseClone 的紧密循环。由于 MemberwiseClone 总是创建一个新实例,这会导致大量内存分配和重新分配,这对性能不利。我为一个非常大的对象编写了一个自定义副本,它将所有属性单独复制到现有对象上,总体上比使用 MemberwiseClone 稍微快一些,
我觉得如果我能够获取整个内存块并将其转储到现有对象上,我将获得相当大的性能提升,因为 GC 不必担心任何事情。希望我也能摆脱这个消息:
只是为了澄清一下,我想尽快将属性从一个现有对象复制到另一个对象。我只需要一个浅拷贝。
消息 2 DA0023:(平均)% GC 时间 = 19.30;
GC 时间百分比相对较高。这种垃圾收集开销过多的迹象可能会影响
您的应用程序的响应能力。您可以收集 .NET 内存
分配数据和对象生命周期信息以了解
您的应用程序使用更好的内存分配模式。
我对代码安全没有任何限制,速度是这里游戏的目标。
没有评论询问这是否真的有必要或谈论过早优化。
感谢您的帮助。
Answer
采纳下面的建议,在对象中嵌入一个结构并在其中存储所有属性。然后我可以获取该结构的副本以复制单个分配中的所有属性。与逐字段复制相比,速度提高了 50% 以上,与每次使用 MemberwiseClone 创建新对象相比,速度提高了约 60%。
如果您的类不可继承,您可以将类的整个状态存储在公开字段结构中(公开字段,而不是属性!)。这需要您在所有字段名称前加上结构名称前缀,这在源代码中会很难看,但是访问该结构中的字段将与访问直接放置在封闭类中的字段一样快。然而,这样做将使您能够使用简单的赋值语句将结构从一个对象实例复制到另一个对象实例中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)