[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.大部分情況下,可以使用 ArrayList 或 List<T> 來取代陣列呼叫;它們比較容易使用,並且一般而言,具有與相同型別的陣列相似的效能。
在條件成立之下,那就可以選用ArrayList 或 List<T>,會比 Array 容易使用,功能也比 Array 多;今日就使用這兩個集合來比較效能。使用集合取代陣列
4.以下則是來實作MSDN上的敘述。
以下畫面是在預設型別下執行,在不轉型的情況之下,List<T> 的效能是 ArrayList 的七倍
{
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 的兩倍不到。
{
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";
}
{
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.範例下載
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET