【发布时间】:2013-08-07 07:57:13
【问题描述】:
向现有数组添加新项目的最快方法是什么?
Dim arr As Integer() = {1, 2, 3}
Dim newItem As Integer = 4
(我已经知道,在处理动态项目列表时,您应该使用List、ArrayList 或类似的IEnumerables。但是如果您坚持使用使用数组的遗留代码该怎么办?)
到目前为止我已经尝试过:
' A) converting to List, add item and convert back
Dim list As List(Of Integer)(arr)
list.Add(newItem)
arr = list.ToArray()
' --> duration for adding 100.000 items: 33270 msec
' B) redim array and add item
ReDim Preserve arr(arr.Length)
arr(arr.Length - 1) = newItem
' --> duration for adding 100.000 items: 9237 msec
' C) using Array.Resize
Array.Resize(arr, arr.Length + 1)
arr(arr.Length - 1) = newItem
' --> duration for adding 100.000 items: 1 msec
' --> duration for adding 100.000.000 items: 1168 msec
A) 似乎很慢,因为每次添加一个项目时都会完成整个数组的两次转换。 B) 似乎更快,但在ReDim Preserve 期间仍然复制了一次数组。 C) 在这一点上似乎是最快的。有没有更好的?
【问题讨论】:
-
恕我直言,我认为您是在将苹果与芒果进行比较:没有人不会使用您的第一个替代品。列表的优点之一是您可以多快地向其中添加新项目(如果您不转换为数组,只需添加项目,您会发现它比任何其他替代方法都快得多):如果您只对快速添加项目感兴趣,请使用列表(根本不依赖数组)。列表还允许比数组允许的更多选项来检查/索引其项目。但除此之外,在纯粹的性能方面(例如在循环内),它们要差得多......
-
总结:在最好的情况下使用数组和列表。尽管 VB.NET 允许重新设置维度,但这并不是数组所期望的传递方式:数组在固定大小的条件下提供最佳性能,只是在其元素内反复迭代。另一方面,列表意味着较少迭代的处理:较少的元素数量、维度的定期变化、访问元素的花哨查询等。所有这些都是数组不太擅长的功能。因此,用于在固定大小条件下执行性能的数组;用于更改条件的列表。
-
PS:列表的内存效率也较低。
-
感谢您的 cmets。像这样构建测试的原因是我想要一个
Extension方法来将项目添加到Array。这样编码需要更少的行:-) -
好吧...如果在您的特定条件下它为您提供了最好的结果,那就去做吧;但是,从理论的角度来看,这没有任何意义:您正在将列表的明确的快速项目添加功能转换为非常缓慢的添加。另一方面,少一行代码会让你振作起来;)
标签: arrays vb.net dynamic-arrays