什么更有效:List .Add()或System.Array.Resize()?

我正在尝试确定List.Add()与使用Array.Resize()方法相比更有效。

Array.Resize的文档说它会复制整个数组,并将其放入一个新对象中。 必须丢弃旧对象。 这个旧对象在哪里? 在堆栈或堆上?

我不知道List.Add()是如何工作的。

有谁知道List.Add方法如何与静态Array.Resize方法进行比较?

我对内存使用(和清理)感兴趣,对于300种值类型更好,而不是20,000种值类型。

对于它的价值,我计划在.NET的嵌入式版本之一上运行此代码。 可能是.NET Gadgeteer

你应该使用List

使用Array.Resize将强制您在每次添加项目时单独展开数组,从而使代码慢。 (因为arrays不能有备用容量)

List由数组支持,但保留了将项目放入的备用容量。
添加项目所需要做的就是在数组中设置一个元素并增加其内部size计数器。
当arrays变满时,列表将使其容量加倍,从而可以毫不费力地再添加未来的项目。

.NET Micro Framework不支持generics,因此我将使用数组,根据需要复制和销毁它。

我可以将perfmance与powertools库中提到的展开链表进行比较: C#中展开的链接列表的任何实现?

.NET Micro Framework(尚未)支持generics。 你对动态集合的限制。

选择方法时要考虑的一件事是微控制器上的托管代码非常非常慢。 托管的.NET Micro Framework对象中的许多操作实际上只是调用本机代码来完成工作。 这要快得多。

例如,比较在for循环中按元素复制数组元素与调用Array.Copy()相比,它基本上在本机代码中执行相同的操作。

尽可能使用这些原生扩展来获得更好的性能。 还可以考虑查看CodePlex上的MicroLinq项目 。 有一个子项目专门用于NETMF上的增强集合(也可用作NuGet包 )。 该代码是免费提供的,并且可以出于任何目的公开许可。 (完全披露:我是该项目的开发者。)

如果你能够分配一个大型arrays并跟踪保存实际数据的最大位置,这将是最快的,但需要更多的工作/思考投入到设计中,并且花费时间来构建很酷的东西。

如果您经常调整arrays大小,列表只会更快,例如每次添加项目时。 但是,如果每隔几帧调整一次,List和内置数组应该是等效的,也许数组仍然更快。

我在反编译后看到了List实现,发现它使用Array.Resize()作为内部数组。 但它管理元素计数器并使用数组的长度作为容量,并在调用Add()时使用一些额外的空间调整数组的大小。 所以,我猜你可以为你的案例制定比List更优化的分配策略。 但您必须手动管理元素计数器。 此外,在访问数组元素时,您将摆脱索引器开销,因为List中的索引器只是请求内部数组元素的方法。 我认为如果只是瓶颈,用手动resize替换List by array是值得的。