C# 为什么是房地产;ElapsedTicks“;列表的数量不等于;ElapsedTicks“;数组的类型?

C# 为什么是房地产;ElapsedTicks“;列表的数量不等于;ElapsedTicks“;数组的类型?,c#,.net,stopwatch,C#,.net,Stopwatch,例如,我有以下代码实现秒表: var list = new List<int>(); var array = new ArrayList(); Stopwatch listStopwatch = new Stopwatch(), arrayStopwatch = new Stopwatch(); listStopwatch.Start(); for (int i =0; i <=10000;i++) { list.Add(10); } listStopwatch.

例如,我有以下代码实现秒表:

var list = new List<int>();
var array = new ArrayList();

Stopwatch listStopwatch = new Stopwatch(), arrayStopwatch = new Stopwatch();

listStopwatch.Start();
for (int i =0; i <=10000;i++)
{
    list.Add(10);
}

listStopwatch.Stop();

arrayStopwatch.Start();
for (int i = 0; i <= 10000; i++)
{
    list.Add(10);
}
arrayStopwatch.Stop();

Console.WriteLine(listStopwatch.ElapsedTicks > arrayStopwatch.ElapsedTicks);
var list=newlist();
var array=new ArrayList();
秒表列表秒表=新秒表(),arrayStopwatch=新秒表();
listStopwatch.Start();

对于(int i=0;i不同的代码预期会产生不同的定时

第二个循环添加到数组中,正如问题所暗示的那样

一个最明显的区别是在
ArrayList
中装箱-每个
int
都存储为装箱值(在堆上创建,而不是在
列表的内联中创建)

第二个循环添加到
列表中
,如示例所示

不断增长的列表需要重新分配和复制所有元素,如果在特定范围内,第二组元素将遇到更多的重新分配(因为复制操作每次需要复制更多的元素),则第二组元素的速度可能较慢


请注意,平均而言(正如Adam Houldsworth所暗示的那样),重新分配的成本是相同的(因为当数组增长时,它们经常发生),但如果在一个或多个案例中有额外的重新分配,则可以找到一组数字,以使一个数字始终不同于另一个数字。需要添加更多的项目才能使差异保持一致。

为什么它们应该是相同的?不能保证它们是相同的。它们可能是相同的,也可能不是。如果您有一个与它们相同的论点必须相等,首先告诉我们你的论点。一个更有趣的问题是问为什么一个比另一个快。第二个循环应该是
array
?顺便说一下,
ArrayList
不是数组(
int[]
)。在这种情况下,它可能只执行一次复制。列表的复制算法是一个加倍操作。第一个循环将执行多次调整大小,直到超过10000项,第二个循环将保证执行零次或一次调整大小(因为第一个循环将它至少放置10000项或更多),但它将是一个大的。它帮助我理解了!非常感谢!!