作者petrushka (不放过自己)
看板C_Sharp
标题Re: [问题] 使用 List会比较有效率吗?
时间Sun May 23 02:50:28 2010
我也来帮忙补充一下MSDN对List<T>与ArrayList的说明,如下:
来源网址:
http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx
Performance Considerations
In deciding whether to use the List<T> or ArrayList class, both of which have
similar functionality, remember that the List<T> class performs better in
most cases and is type safe. If a reference type is used for type T of the
List<T> class, the behavior of the two classes is identical. However, if a
value type is used for type T, you need to consider implementation and boxing
issues.
If a value type is used for type T, the compiler generates an implementation
of the List<T> class specifically for that value type. That means a list
element of a List<T> object does not have to be boxed before the element can
be used, and after about 500 list elements are created the memory saved not
boxing list elements is greater than the memory used to generate the class
implementation.
再参考此Blog开发者所做的实验:
http://allantech.blogspot.com/2007/03/performance-arraylist-vs-list.html
对照上述内容,如同MSDN的说明:
若type T是reference type时,List<T>与ArrayList是无异的。
若type T是value type时,C#编译器则会针对List<T>进行优化。
上述Blog内容只有针对Add操作进行实验,
其他可能还有如looping、coping、inserting...等,也会有些差异。
但不管如何,效能与弹性时常就是很难兼得的。
其实在开发大部份的系统而言,我比较偏好操作弹性佳与易懂的程式码。
也或许我没什麽机会去接触到百万笔以上资料的处理吧,所以没有感受明显的差异。
而且,我若为了效能而写出不容易修改与了解的程式码,反而其他人不好接手。
※ 引述《cole945 (躂躂..)》之铭言:
: int[] 的效能应该是""略""小於 List<T> (後面会说 "略" 在哪里)
: 而 ArrayList 等於是 List<bject>, 两个一样...
: 所以要用哪一个, 基本上看你自己的需求
: 再讲内部一点点..
: 在 C# 的 T[] 其实就是包装过的 System.Arrary
: 而 List<T> 的话, 大略就是
: class List<T>
: {
: T[] items;
: public T this[int index]
: {
: get {
: if( index<_size)
: throw OutOfRange;
: return items[index];
: }
: set {
: if( index<_size)
: throw OutOfRange;
: items[index] = value;
: }
: }
: }
: 事实上, 他比较像 c++中的 vector<T>
: 本质是 fixed size 的 array, 存取快O(1)
: 但他可以一直 Add 东西进去越变越大..
: 如果超过 size 的话, 会重新 alloc 一块更大的 (一般来说用原本的2倍)
--
对於已经无法拥有的
唯一能做的是
不要忘记
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 125.230.123.180
※ 编辑: petrushka 来自: 125.230.123.180 (05/23 02:53)
1F:推 deuter:既然已经有List<T> 已经没有必要再回头用 ArrayList 了 05/23 08:23
2F:→ deuter:而且 List<T> 还可以配上Linq 和 IEnumerable<T>有更多方法 05/23 08:23
3F:推 aej:在.net里面会看到很多很类似的功能,而新旧函式原因占大部分 05/23 10:54
4F:→ aej:这是MS考虑到向下相容,不然旧系统升级就不能用,这是很麻烦的 05/23 10:54
5F:→ aej:到时候为了成本考量也许不会买新的开版来开发 05/23 10:55