分配相同大小的对象是否会改善GC或"新"性能?

Bor*_*ris 12 c# garbage-collection new-operator

假设我们必须创建许多字节数组类型的小对象.大小不一,但总是低于1024字节,比如说780,256,953 ....

如果我们总是只分配字节[1024],并且只使用所需的空间,它会不会随着时间的推移提高操作员的新效率或GC效率?

UPD:这是为了解析二进制协议消息而创建的短生命对象.

UPD:在两种情况下,对象的数量都是相同的,它只是改变的分配大小(随机与总是1024).

在C++中,由于碎片和C++的新性能,它很重要.但在C#....

Eri*_*ert 9

如果我们总是只分配字节[1024],并且只使用所需的空间,它会不会随着时间的推移提高操作员的新效率或GC效率?

也许.您将不得不对其进行分析并查看.

我们在Roslyn编译器中分配语法树节点的方式非常有趣,我最终会做一篇关于它的博客文章.在那之前,你问题的相关部分是这个有趣的琐事.我们的分配模式通常涉及分配"底层"不可变节点(我们称之为"绿色"节点)和包含它的"外观"可变节点(我们称之为"红色"节点).正如您可能想象的那样,我们最终会成对分配这些:绿色,红色,绿色,红色,绿色,红色.

绿色节点是持久的,因此是长寿的; 外墙是短暂的,因为它们在每次编辑时都被丢弃.因此,垃圾收集器通常具有绿色/孔/绿色/孔/绿色/孔,然后绿色节点向上移动一代.

我们的假设一直是使数据结构更小将始终提高GC性能.较小的结构等于分配的内存较少,等于较少的收集压力,等于较少的收集,等于更多的性能,对吧?但我们通过分析发现,在这种情况下使红色节点变小实际上会降低 GC性能.关于孔的特定尺寸的某些东西会以某种奇怪的方式影响GC ; 不是垃圾收集器内部的专家,对我来说这是不透明的.

因此,更改分配大小是否可能以某种不可预测的方式影响GC?对的,这是可能的.但是,首先,它不太可能,其次,在实际情况下尝试并仔细测量GC性能之前,不可能知道您是否处于这种状况.

当然,您可能不会对GC性能进行门控.Roslyn做了很多小的分配,因此调整我们的GC影响行为至关重要,但我们做了一些疯狂的小分配.绝大多数.NET程序都没有像我们那样强调GC.如果你是少数几个以有趣的方式强调GC的程序,那么就没有办法了解它; 您将需要分析和收集经验数据,就像我们在Roslyn团队中所做的那样.

如果你不是那么少数,那么不要担心GC的表现; 你可能在其他地方有一个更大的问题,你应该首先处理.

  • 你能问一下处理GC的团队为什么会这样?我真的很想听到GC的内部专家的回答.主要是因为这种行为对我没有任何意义. (2认同)