存储数组中的枚举VS存储在字典中?
假设我有一些枚举。例如存储数组中的枚举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
选项更快?好吧,我可以测试一下......但是现在当我写下这个问题时,我想知道别人怎么想。
Dictionany<TKey, TValue>
不是“聪明”,doens没有优化任何给定的密钥。低调的实施总是相同的。
然而,有关性能,使用enum
值作为字典的关键是比你想象的要慢得多,并且是远远超过存储Int32
为重点较慢。原因是因为当调用GetHashCode()
时,运行时使用大量反射来获取枚举的哈希码。这如果真的发现很奇怪。
但是,当最可读的方法(使用enum作为字典中的键)足够快时,所有这些都无关紧要。没有人可以为你回答这个问题。你将不得不测量这个。不要过早地进行优化,并使用最易读/可维护的代码,直到证明解决方案的速度不够快(可能会出现这种情况)。
然而,而不是切换到一个数组中,尝试用Int32
键切换到词典:
var dictionary = new Dictionary<int, /*someStructure*/>();
dictionary[(int)MyEnum.Item1] = /*new someStructure()*/;
这是一个主观的答案,但我会亲自使用数组在字典时:
-
所有枚举成员的基础值都是连续的。使用阵列将是不直观的(和废物存储器)是否存在的值之间的大间隙,如在:
enum MyEnum { Units, Tens = 10, Hundreds = 100, }
所有枚举成员将总是具有在结构中的值。如果他们不这样做,则字典将通过其
TryGetValue
方法提供更直观的语义来检查特定密钥的存在。 (也就是说,如果值是引用类型,则可以使用null
来指示缺失。)
我正在优化我的程序中的bottlneck。我花了18微秒来购买我想花费1-2微秒的东西。我发现'Dictionary'在这个部分被用到了很多,所以现在我想我应该试着替换它。带有'int32'键的字典看起来很奇怪,你为什么这么说? – javapowered
在你的情况下,18个微型金钱太多了?你正在开发什么样的程序? – Steven
但正如我所说,更改字典以再次保存'int'键和配置文件。这应该会有很大的不同。 – Steven