2012-03-05 55 views
7

出于好奇,我想测试滴答数以比较GenericList和ArrayList。为什么简单列表<T>似乎比ArrayList慢?

对于下面的代码,当我检查秒表时,ArrayList似乎更快。

我做错了什么或者是否有解释? (我相信名单STO快很多)

Tesing代码及以下输出:

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

enter image description here

+0

我不认为这个测试是可靠的。代码执行的顺序很重要,首先。在第二个列表中添加可能会受到之前分配的影响。还有1000个元素是一个小集合。你应该在两个不同的程序中将填充和获得两种列表分开,然后使用探查器对它们进行测试,而不是使用秒表。 – vulkanino 2012-03-05 08:40:03

+0

当使用int而不是'Point'时它看起来如何?首先测试通用列表? – 2012-03-05 08:41:38

+0

那么,当我增加元素数量到1000001泛型更快。但是这是否意味着在处理一小组元素时,泛型不能被认为是最快的? – pencilCake 2012-03-05 08:43:05

回答

7

更改你的测试程序来运行你的方法至少两次,并忽略第一次运行。结果由代码生成和针对具体类型List<Point>的突变引起。

在我的机器,这导致下面的输出:

Watch 0 : 154 
    Watch 1 : 74 
    Watch 0 > Watch 1 : True 

,这是相当多的人会期待什么。

+0

你是对的!在第二次运行中,即使对于一小组元素,它也快得多。 (所以在这种情况下,如果我运行NGEN。可执行程序;我会确保第一轮运行对于通用列表也是快速的,我假设) – pencilCake 2012-03-05 09:05:31

5

您没有消除像JIT这样的第一个执行效果。泛型需要为每个值类型参数编译一次。

ArrayList已经预编译了ngen。 (如果有的话,我会读核心库实例化常用参数的一些最重要的泛型,比如object,bool,int,...)。所以会产生一次性成本。

您还应该注意,ArrayList的大部分性能成本是间接的:拳击给GC带来更高的压力,并使用更多的内存。但是你的测试不会衡量这一点。产生更多垃圾的成本还取决于存在多少其他对象以及对象的生命周期。

当您编写测试时,您应该在实际测试之前执行一次所有代码,或者使用如此多的迭代以至一次性成本可以忽略不计。使用发布版本并运行而没有附加调试器也很重要。

相关问题