现在的位置: 首页 > 综合 > 正文

C# 泛型集合List和非泛型集合ArrayList的性能比较

2013年10月18日 ⁄ 综合 ⁄ 共 1602字 ⁄ 字号 评论关闭

在使用ArrayList这样的非泛型集合的过程中,要进行装箱和拆箱操作,会有比较大的性能损失,

而使用泛型集合就没有这样的问题。

 

现做一简单测试如下:

  1. //用来记录开始和结束的时间   
  2. DateTime startTime = new DateTime();  
  3. DateTime endTime = new DateTime();  
  4.   
  5. //定义集合类型ArrayList的一个实例
      
  6. ArrayList list = new ArrayList();  
  7.   
  8. //取得当前时间   
  9. startTime = DateTime.Now;  
  10.   
  11. //★★★★★★★★①使用ArrayList类★★★★★★★★
      
  12. //ArrayList的add方法的参数是Object型,   
  13. //当我们把int型作为参数传入的时候需要做装箱操作
      
  14. //装箱操作将值类型转化为Object类型   
  15. for (int i = 0; i < 1000000; i++)  
  16. {  
  17.     list.Add(i);  
  18. }  
  19.   
  20. int iCount = 0;  
  21. //当我们使用int型的时候需要做拆箱操作操作
      
  22. //拆箱操作将应用类型转化为Object类型,拆箱过程要做大量的工作
      
  23. foreach (int i in list)  
  24. {  
  25.     iCount += 1;  
  26. }  
  27.   
  28. Console.WriteLine("使用ArrayList的结果 : {0}", iCount.ToString());  
  29.   
  30. //取得结束时间并计算差值   
  31. endTime = DateTime.Now;  
  32. TimeSpan ts = endTime - startTime;  
  33.   
  34. Console.WriteLine("使用ArrayList的耗时 :" + ts.TotalMilliseconds);  
  35.   
  36. //★★★★★★★★②使用泛型类★★★★★★★★   
  37. //使用List的泛型定义List<T>,int类型在编译器动态生成的类中本替换为int型
      
  38. //执行过程中不再执行装箱拆箱操作   
  39. List<int> list2 = new List<int>();  
  40.   
  41. startTime = DateTime.Now;              
  42.   
  43. for (int i = 0; i < 1000000; i++)  
  44. {  
  45.     list2.Add(i);  
  46. }  
  47.   
  48. iCount = 0;  
  49. foreach (int i in list2)  
  50. {  
  51.     iCount += 1;  
  52. }  
  53.   
  54. Console.WriteLine("使用泛型的结果 : {0}", iCount.ToString());  
  55.   
  56. endTime = DateTime.Now;  
  57. ts = endTime - startTime;  
  58.   
  59. Console.WriteLine("使用泛型的耗时 :" + ts.TotalMilliseconds);  
  60.   
  61. //显示三次结果如下   
  62.   
  63. /* 第一次 
  64.  * 使用ArrayList的耗时 :92 
  65.  * 使用泛型的耗时 :25 
  66.  *  
  67.  * 第二次 
  68.  * 使用ArrayList的耗时 :96 
  69.  * 使用泛型的耗时 :22 
  70.  *  
  71.  * 第三次 
  72.  * 使用ArrayList的耗时 :90 
  73.  * 使用泛型的耗时 :22 
  74.  *  
  75.  * 由此可以明显看出两者的差别 
  76.  * 这里仅仅是时间上的,并不包括对内存消耗的统计 
  77.  *  
  78.  * ※但是也要注意到差别的单位是毫秒, 
  79.  * 我这里只想说明用泛型是有好处的, 
  80.  * 但也不可过分追求程序的孰优孰劣, 
  81.  * 总之要把握好这个度,适合自己的才是最好的  
  82.  * O(∩_∩)O~ 
  83.  */  
  84.   
  85. Console.Read();  

抱歉!评论已关闭.