我们有一个复杂的类,它在我们的Web应用程序中广泛使用,包含许多分配和生存实例。我们试图改善GC中的时间"因此,考虑重组这门课程。
目前它看起来像这样:
class Main {
public Child1 Property1;
public Child1 Property2;
public Child2 Property3;
...
}
class Child1 {
public Geolocation Geolocation;
public string Name;
...
}
class Geolocation {
public double Lat;
public double Lon;
}
根和子类中有很多属性,大多数是布尔和整数,但也有一些字典是字典。没有父级的子类的对象不存在,并且在大多数情况下只传递Main对象。
减少一些结构以减少分配数量是值得的吗? e.g。
class Main {
public Child1 Property1;
public Child1 Property2;
public Child2 Property3;
...
}
struct Child1 {
public Geolocation Geolocation;
public string Name;
...
}
struct Geolocation {
public double Lat;
public double Lon;
}
我知道这不会遵循大多数关于结构的规则,但它会减少分配数量,增加缓存局部性,并且可能使垃圾收集变得更容易。
还有一些缺点,例如:我们必须关心传递这个结构并在某些情况下使用ref参数,但我们认为我们可以处理它。还有其他一些我看不到的负面影响吗?
答案 0 :(得分:1)
作为一般规则:我只考虑移植到有大量(50万或更多)中等生命对象的情况下的结构。我认为,在中等生命中,物体在到达第2代后不久就被释放了。
来源: In managed code we trust, our recent battles with the .NET Garbage Collector