2012-11-17 106 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来指示缺失。)