浅谈 C# 数组,ArrayList,Hashtable,List<T>,Dictionary性能

首先我们分别将数组,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来查找元素的,元素的顺序是不定的。
 

 

技术交流+v:15580072981

               +Q:2512378779

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值