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[]
的枚举器更快,因为它不必检查数组是否已更改。你的英语可能很差,但这不是你拒绝回答的理由。这个网站上确实存在着无情的混蛋,如果他们不能理解你写的东西,那么他们应该让它保持不评分。我只是出于好意才把你撞倒的。和平。我不认为人们会因为糟糕的英语而倒下。正如其他几个答案所指出的,只有当您拥有数十万条记录时,性能差异才会显著。出于许多目的,列表以合理的成本为您提供了更多的功能。只要你有