【发布时间】:2018-04-23 19:06:02
【问题描述】:
假设您需要存储一定数量的数据,这些数据由结构或类表示。您最多只能存储 N 个元素,如果添加更多,您必须先删除现有的。
您可以使用任何您喜欢的方式来存储数据 - 列表、数组(或其他任何您喜欢的方式)。
就垃圾收集而言 - 使用类还是结构来表示信息有区别吗? 将其存储在 List 或 Array 中是否有区别?
我的直觉是最好的方法是使用结构数组,因为原则上 GC 不应该在这里收集任何东西(虽然数组存储在堆上,但它的大小保持不变,因此永远不会收集我相信会发生吗?)。
我不完全确定结构列表将如何表示 - 是否存在与添加/删除结构元素相关的任何形式的垃圾回收?
至于使用类而不是结构,我希望一旦从列表中删除,或者在数组中被覆盖,旧的引用就需要被收集,所以要么会施加 GC 压力。
如果我的直觉在这里是正确的,或者我在任何地方都出错了,我将不胜感激!谢谢
示例代码:
public struct SStruct
{
int ABC;
}
public class SClass
{
int ABC;
}
public class Test
{
List<SStruct> _data1;
List<SClass> _data2;
SStruct[100] _data3;
SClass[100] _data4;
public void run()
{
var sStruct = new SStruct();
var sClass = new SClass();
if(data1.Count > 0)
_data1.RemoveAt(0);
if(data2.Count > 0)
_data2.RemoveAt(0);
_data1.Add(sStruct);
_data2.Add(sClass);
_data3[0] = sStruct;
_data4[0] = sClass;
}
【问题讨论】:
-
你可能会觉得这个article很有趣
-
从表面上看,如果使用结构数组,GC 可以运行得更快,因为它不需要检查这么多引用来查看它们是否还活着(可以从任何根访问)。但是,当使用结构数组时,您最终可能会使数组大小变大(
N * sizeof(struct)而不是N * sizeof(reference)),并且 可能 最终会使数组进入大对象堆,即可能会对内存使用产生负面影响。 -
在 100 个元素中,我认为这个问题并没有太大的不同,而且列表在内部也只是一个数组。为什么...你有 GC 问题或性能问题,还是这只是学术问题?
-
我会使用
List<SomeClass>,除非或直到出现性能问题。不要仅仅因为(甚至没有编写或分析代码)您认为 GC 压力将成为最重要的问题,就做出奇怪的选择。 -
使用数百万个元素会有明显的不同,但如果需要操作这么多元素,最好分块进行。继续从数据库中提取数据并分块处理,然后在性能问题时进行优化。
标签: c#