Unity C# 几种容器的性能比较

 

  1. 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

        

  1. Dictionary.Add会进行Resize、并执行Array.Copy、获取HashCode,其中GethashCode(0.4ms)比较消耗,是主要的消耗点。同时会产生一定的GC
  2. 赋值Dictionary.set_item会调用GetHashCode和Equals,比较消耗
  3. Dictionary.Remove会调用GetHashCode和Equals,比较消耗
  4. Add和赋值消耗接近,但Add会有GC

 

四、ArrayList

  1. Array.Remove多次调用IndexOf,很消耗,同时会调用RemoveAt
  2. Add分有GC。

 

五、HashTable

主要消耗在创建HashCode和Equals上

 

六、Stack

 

七、HashSet

八、Contains比较

 

 

 

总结:

  1. 基于Hash的查找最快,基于Array的查找最慢(主要消耗在IndexOf方法中)
  2. 基于Array的非定长的容器,会调用Reise进行扩容,效率低下,建议使用定长。
  3. Dictionary是基于Hash和Array的,添加时有可能Resize.其Key使用的是Hash,Value使用的是Array。
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值