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。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章