为什么List的属性 "ElapsedTicks"不等于Array的"ElapsedTicks"?

Why property "ElapsedTicks" of List not equal to "ElapsedTicks" of Array?

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

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);

为什么这个值不相等?

不同的代码预计会产生不同的时序。

第二个循环添加到数组作为问题暗示

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

第二个循环添加到 list,如示例所示

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

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