Roslyn ObjectPool结构包装
本文关键字:包装 结构 ObjectPool Roslyn | 更新日期: 2023-09-27 18:13:12
我正在看Roslyn ObjectPool实现(https://github.com/dotnet/roslyn/blob/master/src/Compilers/Core/SharedCollections/ObjectPool%601.cs),我不明白为什么他们不简单地选择拥有一个T数组,而是将T包装在一个结构体内?
[DebuggerDisplay("{Value,nq}")]
private struct Element
{
internal T Value;
}
...
private readonly Element[] _items;
这样做的目的是什么?
这是在设置引用类型的数组项时避免性能问题的常用技巧。数组在CLR(和JVM)上是可变的。你可以把string
写成object[]
。这需要运行时检查,您实际上没有将字符串存储到SomethingElse[]
中。使用这个值类型技巧,就不需要在运行时执行检查了。
我认为这是出于性能原因。与类的数组相比,struct的数组是垃圾收集器的朋友。
选自避免自动GC收集的5个技巧和技术
对于类实例数组,GC必须检入每一项该数组查看它是否是活动对象(对于泛型集合(使用内部数组)。用数组结构,GC只是查看数组本身是否仍然是活动的对象,因为结构不能为空(即使对于可空结构体,它只使用内部跟踪机制来确定无效)。所以这可能是数千甚至数百万当收集运行时,GC不需要检查的项!