在使用ArrayList非泛型集合時,要進行裝箱和拆箱操作,會有比較大的性能損失,
而使用泛型集合,則不會有這樣的問題。
之前我們也介紹過一篇類似的文章C#泛型 與 非泛型性能比較 類型安全的執行個體代碼,大家可以看看。
今天我們用一個例子做下測試,以加深了解。
代碼如下:
複制代碼 代碼示例:
//用來記錄開始和結束的時間
DateTime startTime = new DateTime();
DateTime endTime = new DateTime();
//定義集合類型ArrayList的一個執行個體
ArrayList list = new ArrayList();
//取得目前時間
startTime = DateTime.Now;
//★★★★★★★★①使用ArrayList類★★★★★★★★
//ArrayList的add方法的參數是Object型,
//當我們把int型作為參數傳入的時候需要做裝箱操作
//裝箱操作将值類型轉化為Object類型
for (int i = 0; i < 1000000; i++)
{
list.Add(i);
}
int iCount = 0;
//當我們使用int型的時候需要做拆箱操作操作
//拆箱操作将應用類型轉化為Object類型,拆箱過程要做大量的工作
foreach (int i in list)
{
iCount += 1;
}
Console.WriteLine("使用ArrayList的結果 : {0}", iCount.ToString());
//取得結束時間并計算內插補點
endTime = DateTime.Now;
TimeSpan ts = endTime - startTime;
Console.WriteLine("使用ArrayList的耗時 :" + ts.TotalMilliseconds);
//★★★★★★★★②使用泛型類★★★★★★★★
//使用List的泛型定義List,int類型在編譯器動态生成的類中本替換為int型
//執行過程中不再執行裝箱拆箱操作
List list2 = new List();
startTime = DateTime.Now;
for (int i = 0; i < 1000000; i++)
{
list2.Add(i);
}
iCount = 0;
foreach (int i in list2)
{
iCount += 1;
}
Console.WriteLine("使用泛型的結果 : {0}", iCount.ToString());
endTime = DateTime.Now;
ts = endTime - startTime;
Console.WriteLine("使用泛型的耗時 :" + ts.TotalMilliseconds);
//三次測試結果分别如下
Console.Read();