2012-11-17 148 views
3

假設我有一些枚舉。例如存儲數組中的枚舉VS存儲在字典中?

enum MyEnum 
{ 
    Item1, 
    Item2, 
    Item3 
} 

我想爲枚舉中的每個項目「緩存」一些東西。所以我有兩個選擇。

字典選項:

Dictionary<MyEnum, /*someStructure*/> cache = new Dictionary<MyEnum, /*someStructure*/>>();

或陣列選項:

/*someStructure*/[] cache = new /*someStructure*/[Enum.GetValues(typeof(MyEnum)).Length] 

什麼是每個選項的prons的優劣呢?在我看來,Dictionary選項更易讀易用,但比Array選項慢。

Dictionary實際上會慢嗎?可能Dictionary是「聰明的」,足以理解當enum被用作關鍵字時,那麼只需使用「數組」作爲下屬實現?

所以問題是 - 將「醜陋array選項」比「直接」Dictionary選項更快?好吧,我可以測試一下......但是現在當我寫下這個問題時,我想知道別人怎麼想。

回答

4

Dictionany<TKey, TValue>不是「聰明」,doens沒有優化任何給定的密鑰。低調的實施總是相同的。

然而,有關性能,使用enum值作爲字典的關鍵是比你想象的要慢得多,並且是遠遠超過存儲Int32爲重點較慢。原因是因爲當調用GetHashCode()時,運行時使用大量反射來獲取枚舉的哈希碼。這如果真的發現很奇怪。

但是,當最可讀的方法(使用enum作爲字典中的鍵)足夠快時,所有這些都無關緊要。沒有人可以爲你回答這個問題。你將不得不測量這個。不要過早地進行優化,並使用最易讀/可維護的代碼,直到證明解決方案的速度不夠快(可能會出現這種情況)。

然而,而不是切換到一個數組中,嘗試用Int32鍵切換到詞典:

var dictionary = new Dictionary<int, /*someStructure*/>(); 

dictionary[(int)MyEnum.Item1] = /*new someStructure()*/; 
+0

我正在優化我的程序中的bottlneck。我花了18微秒來購買我想花費1-2微秒的東西。我發現'Dictionary'在這個部分被用到了很多,所以現在我想我應該試着替換它。帶有'int32'鍵的字典看起來很奇怪,你爲什麼這麼說? – javapowered

+0

在你的情況下,18個微型金錢太多了?你正在開發什麼樣的程序? – Steven

+0

但正如我所說,更改字典以再次保存'int'鍵和配置文件。這應該會有很大的不同。 – Steven

1

這是一個主觀的答案,但我會親自使用數組在字典時:

  1. 所有枚舉成員的基礎值都是連續的。使用陣列將是不直觀的(和廢物存儲器)是否存在的值之間的大間隙,如在:

    enum MyEnum { Units, Tens = 10, Hundreds = 100, }

  2. 所有枚舉成員將總是具有在結構中的值。如果他們不這樣做,則字典將通過其TryGetValue方法提供更直觀的語義來檢查特定密鑰的存在。 (也就是說,如果值是引用類型,則可以使用null來指示缺失。)