Bor*_*ris 12 c# garbage-collection new-operator
假设我们必须创建许多字节数组类型的小对象.大小不一,但总是低于1024字节,比如说780,256,953 ....
如果我们总是只分配字节[1024],并且只使用所需的空间,它会不会随着时间的推移提高操作员的新效率或GC效率?
UPD:这是为了解析二进制协议消息而创建的短生命对象.
UPD:在两种情况下,对象的数量都是相同的,它只是改变的分配大小(随机与总是1024).
在C++中,由于碎片和C++的新性能,它很重要.但在C#....
如果我们总是只分配字节[1024],并且只使用所需的空间,它会不会随着时间的推移提高操作员的新效率或GC效率?
也许.您将不得不对其进行分析并查看.
我们在Roslyn编译器中分配语法树节点的方式非常有趣,我最终会做一篇关于它的博客文章.在那之前,你问题的相关部分是这个有趣的琐事.我们的分配模式通常涉及分配"底层"不可变节点(我们称之为"绿色"节点)和包含它的"外观"可变节点(我们称之为"红色"节点).正如您可能想象的那样,我们最终会成对分配这些:绿色,红色,绿色,红色,绿色,红色.
绿色节点是持久的,因此是长寿的; 外墙是短暂的,因为它们在每次编辑时都被丢弃.因此,垃圾收集器通常具有绿色/孔/绿色/孔/绿色/孔,然后绿色节点向上移动一代.
我们的假设一直是使数据结构更小将始终提高GC性能.较小的结构等于分配的内存较少,等于较少的收集压力,等于较少的收集,等于更多的性能,对吧?但我们通过分析发现,在这种情况下使红色节点变小实际上会降低 GC性能.关于孔的特定尺寸的某些东西会以某种奇怪的方式影响GC ; 不是垃圾收集器内部的专家,对我来说这是不透明的.
因此,更改分配大小是否可能以某种不可预测的方式影响GC?对的,这是可能的.但是,首先,它不太可能,其次,在实际情况下尝试并仔细测量GC性能之前,不可能知道您是否处于这种状况.
当然,您可能不会对GC性能进行门控.Roslyn做了很多小的分配,因此调整我们的GC影响行为至关重要,但我们做了一些疯狂的小分配.绝大多数.NET程序都没有像我们那样强调GC.如果你是少数几个以有趣的方式强调GC的程序,那么就没有办法了解它; 您将需要分析和收集经验数据,就像我们在Roslyn团队中所做的那样.
如果你不是那么少数,那么不要担心GC的表现; 你可能在其他地方有一个更大的问题,你应该首先处理.
| 归档时间: |
|
| 查看次数: |
466 次 |
| 最近记录: |