C# 哪个更有效:列表<;int>;或int[]
有人能告诉我在C# 哪个更有效:列表<;int>;或int[],c#,list,C#,List,有人能告诉我在List和int[]之间哪个更有效。因为我正在做一个项目,正如你们可能知道的,效率是现在非常重要的问题 如果您在文章中添加了一些介绍性说明,那就太好了:)列表在内部使用数组,因此(正确地)使用数组总是更有效(或至少更有效)。(列表应该可以调整大小)?列表:int[] (list should be resizable) ? List<int> : int[] List是int[]的包装器,可根据需要调整大小。使用JIT内联,它们的性能应该几乎相同,但是JIT将更容易
List
和int[]
之间哪个更有效。因为我正在做一个项目,正如你们可能知道的,效率是现在非常重要的问题
如果您在文章中添加了一些介绍性说明,那就太好了:)列表在内部使用数组,因此(正确地)使用数组总是更有效(或至少更有效)。
(列表应该可以调整大小)?列表:int[]
(list should be resizable) ? List<int> : int[]
List
是int[]
的包装器,可根据需要调整大小。使用JIT内联,它们的性能应该几乎相同,但是JIT将更容易从int[]中获得额外的性能
因为它是一个具有专用IL指令的CLI原语。如果您确切知道集合中将包含多少元素,并且不需要列表的任何额外功能,而且(这是一个非常严重的和)性能是一个严重问题,请使用int[]
。否则,请坚持使用List
如果您计划使用列表提供的任何功能(搜索、排序、删除、调整大小),那么我会选择列表,因为这些功能可能已经非常优化,您将无法编写更好的版本。为了好玩,我运行了以下命令:
int cap = 100000;
Stopwatch sw1 = new Stopwatch();
sw1.Start();
int[] ix = new int[cap];
for (int x = 0; x < cap; x++)
{
ix[x] = 1;
}
sw1.Stop();
Stopwatch sw2 = new Stopwatch();
sw2.Start();
List<int> iy = new List<int>(cap);
for (int y = 0; y < cap; y++)
{
iy.Add(y);
}
sw2.Stop();
Console.WriteLine(cap.ToString() + " int[]=" + sw1.ElapsedTicks.ToString());
Console.WriteLine(cap.ToString() + " List<int>=" + sw2.ElapsedTicks.ToString());
Console.ReadKey();
int cap=100000;
秒表sw1=新秒表();
sw1.Start();
int[]ix=新的int[cap];
对于(int x=0;x
得到这个:
100000 int[]=1796542
100000 List=2517922
100000整数[]=1796542
100000名单=2517922
我在几毫秒内尝试了它,分别得到了0和1。显然int[]要快得多,但除非你说的是大数组,否则我会说它只是名义上的。后者更有效。
在源代码中,列表
由一些数组命名。
例如,List aa=newlist()代码>
通常,会声明一个数组类型[]
,它的长度是一个特定的数字。
换句话说,如果您声明了一个列表
,则表示已经使用了一个大空间。
如果列表的
元素长度过长,则应将数组复制到另一个较大的数组中。
因此,最好不要使用List
更好的使用方法是声明其长度。
列表aa=新列表(10)
使用T[]
时,大多数列表
的功能都可以作为数组
类的静态成员使用。如果列表大小固定,请使用T[]
,因为两者都实现了IList
。小心过早优化。如果效率在应用程序中很重要,那么最好编写测试来衡量整个功能的性能,而不是专注于微观优化。通常,真正的优化需要干净的设计,而微观优化会阻碍干净的设计。从一开始就正确使用错误的数据结构会严重影响您的性能,根据您的需要选择正确的数据结构总是值得的,如果列表是错误的数据结构,那么数组不太可能是正确的。这不是我的经验。我经常在不需要列表调整大小的时候使用数组。问题是什么样的时间才是最重要的?您的公司真正支付的开发时间,还是在代码运行中节省一些时间?如果因为使用自动调整大小而使用List
编码的时间较少,请使用它。如果只需要静态大小数组,请使用int[]
。参考答案280Z28,您已接受。如果您在列表构造函数中设置初始容量,就像在数组中设置初始容量一样,我会怀疑性能会更接近。@guardi:他确实为列表设置了容量。列表iy=新列表(cap)。根据我的经验,int[]要快得多。像这样的一次测试是没有意义的。您需要多次运行测试并平均结果。但由于类所隐含的方法调用开销,列表可能总是比较慢。@orj,它怎么可能是“无意义的”。按照你说的去做可能更有意义,但这并不是毫无意义的。你太苛刻了,一点也不准确。此外,你认为我在发布此回复之前运行了多少次?这不仅仅是一次,发布的结果是所有跑步的典型结果。我没有费心计算它们的平均值,但似乎没有必要进行“满”基准测试。@过度:整数没有装箱/拆箱。如果通用参数T
是值类型,则T[]
将是一个值数组,而不是一个装箱值数组。List.Sort
只调用内部数据数组上的array.Sort
,该数组可用于任何数组。搜索也是如此。List
提供的唯一真正功能是自动调整大小和ForEach()
,但我认为T[]
的枚举器更快,因为它不必检查数组是否已更改。你的英语可能很差,但这不是你拒绝回答的理由。这个网站上确实存在着无情的混蛋,如果他们不能理解你写的东西,那么他们应该让它保持不评分。我只是出于好意才把你撞倒的。和平。我不认为人们会因为糟糕的英语而倒下。正如其他几个答案所指出的,只有当您拥有数十万条记录时,性能差异才会显著。出于许多目的,列表以合理的成本为您提供了更多的功能。只要你有