使用结构来减少分配数

时间:2015-12-16 14:05:09

标签: c# garbage-collection

我们有一个复杂的类,它在我们的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参数,但我们认为我们可以处理它。还有其他一些我看不到的负面影响吗?

1 个答案:

答案 0 :(得分:1)

Sam Saffron在一篇非常有趣的博客文章中写道,StackExchange网站上有关垃圾收集的类似问题:

  

作为一般规则:我只考虑移植到有大量(50万或更多)中等生命对象的情况下的结构。我认为,在中等生命中,物体在到达第2代后不久就被释放了。

来源: In managed code we trust, our recent battles with the .NET Garbage Collector