数组与列表的性能比较
数组与列表的性能比较
假设您需要一个整数的列表/数组,需要频繁迭代,而且我指的是极其频繁。原因可能各不相同,但假设它在高容量处理的最内部循环的核心中。
一般来说,由于其大小的灵活性,人们会选择使用列表(List)。此外,msdn文档声称列表在内部使用数组,并且应该与数组一样快(经过Reflector的快速查看证实了这一点)。不过,这里确实涉及一些开销。
有人实际上测量过这个吗?迭代6M次列表是否需要与数组相同的时间?
admin 更改状态以发布 2023年5月23日
简答:
在 .NET 中,List
和 Array
的速度/性能相同,因为在 .NET 中,List
是 Array
的包装器。
再说一遍:在 .NET 中,List
是另一种语言中的 ArrayList
的内部扩展!
下面是关于在什么情况下使用哪种方法的细节:
-
需要使用 Array:
- 尽可能频繁使用。因为它速度快,在相同数量信息的情况下,占用 RAM 范围小。
- 如果你知道需要的单元格数
- 如果数据保存在数组中,小于 85000 b(对于整数数据来说,85000/32 = 2656 个元素)
- 如果需要高的随机访问速度
-
需要使用 List:
- 如果需要经常向列表末尾添加单元格
- 如果不经常向列表开头/中间添加单元格
- 如果数据保存在数组中,小于 85000 b(对于整数数据来说,85000/32 = 2656 个元素)
- 如果需要高的随机访问速度
-
需要使用 LinkedList:
-
如果经常需要向列表开头/中间/末尾添加单元格
-
如果只需要顺序访问(前进/后退)
-
如果需要保存大型项目,但项目计数较低。
-
最好不要用于大量项目,因为它会使用额外的链接内存。
如果你不确定是否需要 LinkedList,那么你不需要它。
-
只是不要使用它。
更多细节:
更多的细节:
测量非常容易...
在我知道长度固定的小型紧密循环处理代码中,我使用数组进行微型优化; 如果您使用索引器/for格式,那么数组可能稍微快一些,但我记得它取决于数组中的数据类型。 但是,除非您需要微调优化,否则请保持简单并使用List
当然,只有在您阅读所有数据时才适用; 对于基于密钥的查找,字典将更快。
以下是使用int的结果(第二个数字是用于验证它们都执行了相同工作的校验和):
(编辑以修复错误)
List/for: 1971ms (589725196) Array/for: 1864ms (589725196) List/foreach: 3054ms (589725196) Array/foreach: 1860ms (589725196)
基于测试装置:
using System; using System.Collections.Generic; using System.Diagnostics; static class Program { static void Main() { Listlist = new List (6000000); Random rand = new Random(12345); for (int i = 0; i < 6000000; i++) { list.Add(rand.Next(5000)); } int[] arr = list.ToArray(); int chk = 0; Stopwatch watch = Stopwatch.StartNew(); for (int rpt = 0; rpt < 100; rpt++) { int len = list.Count; for (int i = 0; i < len; i++) { chk += list[i]; } } watch.Stop(); Console.WriteLine("List/for: {0}ms ({1})", watch.ElapsedMilliseconds, chk); chk = 0; watch = Stopwatch.StartNew(); for (int rpt = 0; rpt < 100; rpt++) { for (int i = 0; i < arr.Length; i++) { chk += arr[i]; } } watch.Stop(); Console.WriteLine("Array/for: {0}ms ({1})", watch.ElapsedMilliseconds, chk); chk = 0; watch = Stopwatch.StartNew(); for (int rpt = 0; rpt < 100; rpt++) { foreach (int i in list) { chk += i; } } watch.Stop(); Console.WriteLine("List/foreach: {0}ms ({1})", watch.ElapsedMilliseconds, chk); chk = 0; watch = Stopwatch.StartNew(); for (int rpt = 0; rpt < 100; rpt++) { foreach (int i in arr) { chk += i; } } watch.Stop(); Console.WriteLine("Array/foreach: {0}ms ({1})", watch.ElapsedMilliseconds, chk); Console.ReadLine(); } }