[C#.NET][VB.NET] ArrayList 與 List<> 執行效能比較

[C#.NET][VB.NET] ArrayList 與 List<> 執行效能比較

記得曾經寫過[C#.NET][VB.NET] 一般集合 - ArrayList 類別 排序,現在來比較 ArrayList List<T>一下兩個集合的效能

在MSDN裡有篇ArrayList 和 List 集合型別,整篇的敘述會讓人有點亂,若先忽略功能,單純用效能重點來看:

1.特定型別 (Object 以外) 的 Array 具有比 ArrayList 更佳的效能,因為 ArrayList 的元素型別為 Object,而且儲存或擷取實值型別 (Value Type) 時,通常會產生 Boxing 和 Unboxing 的狀況。然而,List<T> 如果不需要重新配置,亦即如果初始容量是清單大小上限的概數,它便具備了與相同型別的陣列相近的效能。Boxing 和 Unboxing (C# 程式設計手冊)

也就是你丟什麼東西給ArrayList 它都會變成Object,然後再轉成你要的型別,一直轉來轉去也會累吧,效能當然也會差一點。

2.List<T> 如果不需要重新配置,亦即如果初始容量是清單大小上限的概數,它便具備了與相同型別的陣列相近的效能。

這個部份應該很白話了

3.大部分情況下,可以使用 ArrayListList<T> 來取代陣列呼叫;它們比較容易使用,並且一般而言,具有與相同型別的陣列相似的效能。

在條件成立之下,那就可以選用ArrayListList<T>,會比 Array 容易使用,功能也比 Array 多;今日就使用這兩個集合來比較效能。使用集合取代陣列

4.以下則是來實作MSDN上的敘述。 

以下畫面是在預設型別下執行,在不轉型的情況之下,List<T> 的效能是 ArrayList 的七倍

快照-2009102255010

{
    ArrayList arr = new ArrayList();
    List<int> List=new List<int>();
    //ArrayList 開始計時
    DateTime dt=DateTime.Now;
    for (int i = 0; i < 1000000; i++)
    {
        arr.Add(i);
    }
    TimeSpan ts1 = DateTime.Now - dt;
    this.label1.Text = "ArrayList 共花費: " + ts1.Milliseconds + " ms";
    //List<> 開始計時
    dt = DateTime.Now;
    for (int i = 0; i < 1000000; i++)
    {
        List.Add(i);
    }
    TimeSpan ts2 = DateTime.Now - dt;
    this.label2.Text = "List<> 共花費: " + ts2.Milliseconds+" ms";
}

若轉型的情況之下 int→string,List<T> 的效能是 ArrayList 的兩倍不到。

快照-2009102255524

{
    ArrayList arr = new ArrayList();
    List<string> List = new List<string>(); 

    //ArrayList 開始計時
    DateTime dt = DateTime.Now;
    for (int i = 0; i < 1000000; i++)
    {
        arr.Add(i.ToString());
    }
    TimeSpan ts1 = DateTime.Now - dt;
    this.label3.Text = "ArrayList 共花費: " + ts1.Milliseconds + " ms";
    //List<> 開始計時
    dt = DateTime.Now;
    for (int i = 0; i < 1000000; i++)
    {
        List.Add(i.ToString());
    }
    TimeSpan ts2 = DateTime.Now - dt;
    this.label4.Text = "List<> 共花費: " + ts2.Milliseconds + " ms";
}


快照-200910226041

{
    ArrayList arr = new ArrayList();
    List<object> List = new List<object>();

    //ArrayList 開始計時
    DateTime dt = DateTime.Now;
    for (int i = 0; i < 1000000; i++)
    {
       arr.Add(i);
    }
    TimeSpan ts1 = DateTime.Now - dt;
    this.label5.Text = "ArrayList 共花費: " + ts1.Milliseconds + " ms";
    //List<> 開始計時
    dt = DateTime.Now;
    for (int i = 0; i < 1000000; i++)
    {
        List.Add(i);
    }
    TimeSpan ts2 = DateTime.Now - dt;
    this.label6.Text = "List<> 共花費: " + ts2.Milliseconds + " ms";
}

6.以上若有謬誤,請不吝惜告知,小弟立即修正。

7.範例下載

VB_ArrayList與List泛型比較.rar

C#_ArrayList與List泛型比較.rar

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo