繁体   English   中英

将 class 的成员重构为结构容器时是否有性能考虑?

[英]Are there performance considerations when refactoring members of a class into a struct container?

可以说我有几个这样的课程:

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;
}

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

如果我理解正确,如果DirectionMap是 class,它会使用更多的 memory 来存储指向它的指针,并额外触摸堆,对吧? 但它作为结构是免费的吗?

我知道结构中的可变对象可能会导致错误,但我不打算传递Data ,只是它包含的字符串列表,它们是参考值。

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

如果您将内容放在结构中而不是直接放在 class 中,我希望 memory 的用法和性能是相同的。 memory 布局应该相似或相同。

除非你非常小心,否则我不建议改变结构。 即替换 Up-list 的内容会很好,但用新列表替换 Up-list 可能会导致问题。 请参阅为什么变异结构是邪恶的

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2025 STACKOOM.COM