gpt4 book ai didi

c# - 将类的成员重构为结构容器时是否有性能考虑?

转载 作者:行者123 更新时间:2023-12-04 10:07:57 28 4
gpt4 key购买 nike

可以说我有几个这样的类(class):

class MyClassA {
public List<string> UpData;
public List<string> DownData;
public List<string> LeftData;
public List<string> RightData;
}

class MyClassB {
public List<string> UpData;
public List<string> DownData;
public List<string> LeftData;
public List<string> RightData;
}

我想重构它们,这样我就可以添加一些便利(比如枚举器,或者有一些让我选择特定成员的函数):
struct DirectionMap {
public List<string> Up;
public List<string> Down;
public List<string> Left;
public List<string> Right;
//... various helper functions ...
}

class MyClassA {
public DirectionMap Data;
}

class MyClassB {
public DirectionMap Data;
}


但是,我的应用程序非常占用内存,并且我有数百万个这样的实例,因此我需要牢记内存使用和垃圾收集。我还必须尽可能频繁地改变这些对象,所以速度也很重要。这样做有什么性能开销吗?

如果我理解正确,如果 DirectionMap是一个类,它会使用更多的内存来存储指向它的指针,并多接触一次堆,对吧?但它作为结构是免费的吗?

我知道结构中的可变对象会导致错误,但我不打算通过 Data周围,​​只是它包含的字符串列表,它们是引用值。

最佳答案

谈论性能的第一条规则是分析代码,即使是经验丰富的开发人员也可能会对事情需要时间感到惊讶。

如果你把东西放在一个结构中而不是直接放在一个类中,我希望内存使用和性能是相同的。内存布局应该相似或相同。

除非你非常小心,否则我不建议改变结构。 IE。替换 Up-list 的内容会很好,但用新列表替换 Up-list 可能会导致问题。见 Why mutating structs are evil .

如果为结构实现接口(interface),则需要注意装箱。如果您实现 IEnumerable<List<string>>并使用任何 linq 方法,这将导致结构为 boxed ,不适合性能。这应该可以通过使用通用约束来避免。您可能还想使用只读结构和 in parameter modifier避免复制。例如 :

public static void MyMethod<T, U>(in T value) where T : struct, IEnumerable<U>
{
// do something
}

关于c# - 将类的成员重构为结构容器时是否有性能考虑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61473646/

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