【发布时间】:2012-03-22 17:57:23
【问题描述】:
出于好奇,我想测试滴答数以将 GenericList 与 ArrayList 进行比较。
对于下面的代码,当我检查秒表时,ArrayList 似乎更快。
我做错了什么还是对此有解释? (我相信 List 会快得多)
测试代码和下面的输出:
private static void ArrayListVsGenericList()
{
// Measure for ArrayList
Stopwatch w0 = new Stopwatch();
w0.Start();
ArrayList aList = new ArrayList();
for (int i = 0; i < 1001; i++)
{
Point p = new Point();
p.X = p.Y = i;
aList.Add(p);
}
foreach (Point point in aList)
{
int v0 = ((Point) aList[8]).X; //unboxing
}
w0.Stop();
// Measure for Generic List<Point>
Stopwatch w1 = new Stopwatch();
w1.Start();
List<Point> list = new List<Point>();
for (int i = 0; i < 1001; i++)
{
Point p = new Point();
p.X = p.Y = i;
list.Add(p);
}
foreach (var point in list)
{
int v1 = list[8].X;
}
w1.Stop();
Console.WriteLine("Watch 0 : " + w0.ElapsedTicks);
Console.WriteLine("Watch 1 : " + w1.ElapsedTicks);
Console.WriteLine("Watch 0 > Watch 1 : " + (w0.ElapsedTicks > w1.ElapsedTicks));
}
【问题讨论】:
-
我认为这个测试不可靠。首先,代码执行的顺序很重要。添加第二个列表可能会受到先前分配的影响。 1000 个元素也是一个小集合。您绝对应该在两个不同的程序中将两种列表的填充和获取分开,然后使用分析器而不是秒表来测试它们。
-
使用
ints 代替Points 的效果如何?什么时候先测试通用列表? -
好吧,当我将元素数量增加到 1000001 时,泛型会更快。但这是否意味着泛型在处理少量元素时不能被认为是最快的?
-
您应该在它们的构造函数中使用初始容量初始化这两个列表,以减少
for循环期间的分配成本。出于同样的原因,比较foreach循环的性能如果您多次而不是只运行一次,也会很有趣。 -
@perncilCake:您可以通过以下方式获得更多信息:stackoverflow.com/questions/5251335/…
标签: c# .net generics arraylist clr