gpt4 book ai didi

c# - MemberwiseClone 相当于现有对象?

转载 作者:行者123 更新时间:2023-12-02 01:10:26 28 4
gpt4 key购买 nike

这里有很多关于 MemberwiseClone 的问题,但我找不到任何内容。

据我了解,MemberwiseClone 基本上只是复制一个对象的内存区域,将其转储到其他地方并将其称为该对象的新实例。显然非常快,而且对于大对象来说,这是制作副本的最快方法。对于具有简单构造函数的小对象,创建实例并复制各个属性会更快。

现在,我有一个使用 MemberwiseClone 的紧密循环。由于 MemberwiseClone 总是创建一个新实例,这会导致大量内存分配和重新分配,这对性能来说不是很好。我已经为一个非常大的对象编写了一个自定义副本,该副本将所有属性单独复制到一个现有对象上,总体上比使用 MemberwiseClone 快一点,

我觉得如果我可以获取整个内存块并将其转储到现有对象上,我将获得不错的性能提升,因为 GC 无需担心任何事情。希望我也能摆脱这条消息:

澄清一下,我想尽快将属性从一个现有对象复制到另一个对象。我只需要一个浅拷贝。

Message 2 DA0023: (Average)% Time in GC = 19.30; % Time in GC is relatively high. This indication of excessive amount of garbage collection overhead could be impacting the responsiveness of your application. You can gather .NET memory allocation data and object lifetime information to understand the pattern of memory allocation your application uses better.

我对代码安全没有任何限制,速度是这里游戏的目标。

请不要评论询问这是否真的有必要或谈论过早的优化。

感谢您的帮助。

回答

采纳下面的建议,在对象中嵌入一个结构并将所有属性存储在其中。然后我可以获取该结构的副本以复制单个分配中的所有属性。与逐字段复制相比,这产生了超过 50% 的速度提升,并且与每次使用 MemberwiseClone 创建新对象相比,速度提升了大约 60%。

最佳答案

如果您的类不可继承,您可以将类的整个状态存储在公开字段结构中(公开字段,而不是属性!)。这将要求您在所有字段名称前加上结构的名称,这在源代码中会很丑陋,但访问该结构中的字段将与访问直接放置在封闭类中的字段一样快。但是,这样做将使您能够使用简单的赋值语句将结构从一个对象实例复制到另一个对象实例。

关于c# - MemberwiseClone 相当于现有对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18086950/

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