为什么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 所暗示的那样)重新分配的成本是相同的(因为当数组增长时它们发生的频率最低),但是当有额外的重新分配时,人们可以找到一组数字的情况下得到一个数字始终不同于另一个。需要添加更多的项目才能使差异保持一致。
例如我有以下代码实现秒表:
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 所暗示的那样)重新分配的成本是相同的(因为当数组增长时它们发生的频率最低),但是当有额外的重新分配时,人们可以找到一组数字的情况下得到一个数字始终不同于另一个。需要添加更多的项目才能使差异保持一致。