[英]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.