2012-03-05 23 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帶來更高的壓力,並使用更多的內存。但是你的測試不會衡量這一點。產生更多垃圾的成本還取決於存在多少其他對象以及對象的生命週期。

當您編寫測試時,您應該在實際測試之前執行一次所有代碼,或者使用如此多的迭代以至一次性成本可以忽略不計。使用發佈版本並運行而沒有附加調試器也很重要。

相關問題