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

时间:2015-04-27 14:34:56

标签: 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.Stop();

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

Console.WriteLine(listStopwatch.ElapsedTicks > arrayStopwatch.ElapsedTicks);

为什么这个值不相等?

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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