首先我们分别将数组,List<T> ,ArrayList,Hashtable,Dictionary<K,V>分别插入1000000条数据进行性能比较
1.数组插入代码
//数组插入测试
int[] nums = new int[1000000];
DateTime arrBegin = DateTime.Now;
for (int i = 0; i < 1000000; i++)
{
nums[i] = i;
}
DateTime arrEnd = DateTime.Now;
Console.WriteLine("数组插入1000000条数据所花时间:"+(arrEnd - arrBegin));
2.ArrayList插入代码
//ArrayList插入测试
ArrayList arrayList = new ArrayList();
DateTime arrayListBegin = DateTime.Now;
for (int i = 0; i < 1000000; i++)
{
arrayList.Add(i);
}
DateTime arrayListEnd = DateTime.Now;
Console.WriteLine("ArrayList插入1000000条数据所花时间:" + (arrayListEnd - arrayListBegin));
3.List<T>插入代码
//List<T>插入测试
List<int> list = new List<int>();
DateTime listBegin = DateTime.Now;
for (int i = 0; i < 1000000; i++)
{
list.Add(i);
}
DateTime listEnd = DateTime.Now;
Console.WriteLine("List插入1000000条数据所花时间:" + (listEnd - listBegin));
4.Hashtable插入代码
//Hashtable插入测试
Hashtable hashtable = new Hashtable();
DateTime hasBegin = DateTime.Now;
for (int i = 0; i < 1000000; i++)
{
hashtable.Add(i, i);
}
DateTime hasEnd = DateTime.Now;
Console.WriteLine("Hashtable插入1000000条数据所花时间:" + (hasEnd - hasBegin));
5.Dictionary<K,V>插入代码
//Dictionary插入测试
Dictionary<int,int> dic = new Dictionary<int, int>();
DateTime dicBegin = DateTime.Now;
for (int i = 0; i < 1000000; i++)
{
dic.Add(i, i);
}
DateTime dicEnd = DateTime.Now;
Console.WriteLine("Dictionary插入1000000条数据所花时间:" + (dicEnd - dicBegin));
代码运行结下图所示
经过测试,测试数据有波动性,但基本可以确定它们之间的插入性能为:
List>数组>Dictionary>ArrayList>Hashtable
我们测试过插入性能后,接着来测试它们之间的遍历性能
//数组遍历测试
DateTime beginTime = DateTime.Now;
foreach (var item in nums){}
DateTime endTime = DateTime.Now;
Console.WriteLine("数组遍历1000000条数据所花时间为: " + (endTime - beginTime));
//ArrayList遍历测试
beginTime = DateTime.Now;
foreach (var item in arrayList) { }
endTime = DateTime.Now;
Console.WriteLine("ArrayList遍历1000000条数据所花时间为: " + (endTime - beginTime));
//List<T>遍历测试
beginTime = DateTime.Now;
foreach (var item in list) { }
endTime = DateTime.Now;
Console.WriteLine("List<T>遍历1000000条数据所花时间为: " + (endTime - beginTime));
//Hashtable遍历测试
beginTime = DateTime.Now;
foreach (var item in hashtable) { }
endTime = DateTime.Now;
Console.WriteLine("Hashtable遍历1000000条数据所花时间为: " + (endTime - beginTime));
//Dictionary遍历测试
beginTime = DateTime.Now;
foreach (var item in dic) { }
endTime = DateTime.Now;
Console.WriteLine("Dictionary遍历1000000条数据所花时间为:" + (endTime - beginTime));
代码运行如下图所示:
经过测试,测试数据有一定波动性,但基本可以确定它们之间的遍历性能为:
数组>List>ArrayList>Dictionary>Hashtable
数组:在初始化时必须指定其大小和类型,他在内存中是连续存储的,所以可以看出数组的索引速度是非常快的。在确定了数组的长度和类型后,选择数组存储数据是比较好的选择。不适合插入操作。
ArrayList:在初始化的时候不需要指定其大小和类型。他可以存储不同的数据类型,但是在存取得过程中会引起装箱和拆箱,降低了性能。插入操作方便。
Hashtable: 在初始化的时候不需要指定其大小和类型,需要指定一个唯一的Key值,内存较大.而且在存取过程中会装箱和拆箱,降低性能,所以插入和遍历速度较慢。
List:在初始化的时候必须指定其类型,但是不需要指定大小,所以他不会像ArraryList那样在存取过程中引起装箱和拆箱操作。在类型相同的情况下,List和数组的性能相当。插入操作方便。
Dictionary:在初始化的时候也必须指定其类型,而且他还需要指定一个Key,并且这个Key是唯一的。正因为这样,Dictionary的索引速度非常快。但是也因为他增加了一个Key,Dictionary占用的内存空间比其他类型要大。他是通过Key来查找元素的,元素的顺序是不定的。