- 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。