- List
1、List.Remove分兩步:List.IndexOf和List.RemoveAt。所以儘量使用List.RemoveAt替代。
2、List使用Array實現的,List.IndexOf即Array.IndexOf,最消耗,消耗佔91%。
3、List.RemoveAt會調用Array.Clear,但不會重新創建Array。
4、List.Add,會使Array長度變化,會重新構建一個Array,然後把原數組中的Copy過去。會引起GC.
5、List.GetItem索引比較快,幾乎不消耗。
二、Array
只能處理定長的數據,添加和刪除不方便,只能進行封裝處理。
IndexOf非常消耗
三、Dictionary
- Dictionary.Add會進行Resize、並執行Array.Copy、獲取HashCode,其中GethashCode(0.4ms)比較消耗,是主要的消耗點。同時會產生一定的GC
- 賦值Dictionary.set_item會調用GetHashCode和Equals,比較消耗
- Dictionary.Remove會調用GetHashCode和Equals,比較消耗
- Add和賦值消耗接近,但Add會有GC
四、ArrayList
- Array.Remove多次調用IndexOf,很消耗,同時會調用RemoveAt
- Add分有GC。
五、HashTable
主要消耗在創建HashCode和Equals上
六、Stack
七、HashSet
八、Contains比較
總結:
- 基於Hash的查找最快,基於Array的查找最慢(主要消耗在IndexOf方法中)
- 基於Array的非定長的容器,會調用Reise進行擴容,效率低下,建議使用定長。
- Dictionary是基於Hash和Array的,添加時有可能Resize.其Key使用的是Hash,Value使用的是Array。