null引用类型变量是否影响垃圾收集器(GC)性能?

时间:2013-12-13 09:48:52

标签: c# garbage-collection

IIRC,.NET Framework中基于代的垃圾收集器通过扫描进程的内存来查找引用来确定哪些对象仍处于活动状态。引用类型变量(特别是那些已设置为null)的数量是否会影响此扫描的速度?

例如,在我的应用程序中,我正在设计一种网格容器,预计会存储很多空Cell。由于Cell(在此示例中)包含引用类型变量,因此Cell的每个实例都会在我的应用程序中为引用类型变量的数量添加+1。

struct Cell { public SomeReferenceType objRef; }

如果这些单元格中只有一小部分的objRef不是null,我是否无意中损害了GC的性能?

1 个答案:

答案 0 :(得分:1)

通常跟踪GC可以分为两部分:检查可达性和删除不可到达的对象。如果仅创建更多引用而不添加任何无法访问的对象,则不会影响第二部分所需的工作,但必须访问每个(可访问的)引用以确定整个对象图的可访问性。这假设结构是可达的(如果它们不可用,例如因为它们是孤立的数组的一部分,它们永远不会被访问)。

也就是说,这项工作是微不足道的,单指针比较和条件分支(如果大多数引用确实是null,将会正确预测)。如果这些结构是大数组的一部分(这是我可以看到你获得大量结构但没有引入许多其他非空引用的唯一方法),那就更加复杂了。

非空引用更昂贵,因为GC必须遵循它( - >潜在的缓存未命中)并且可能遍历通过所述引用可到达的大对象子图( - >许多额外工作)。