2015-07-01 38 views
1

我有大对象,我想通过字符串标识符访问。我目前的做法是使用字典包含这些:大对象字典与数组索引字典

var myObjects = new Dictionary<string, LargeObjectClass>(); 
var specificObject = myObjects["identifier"]; 

现在我想知道是否存储许多在字典那些大型的对象可能是坏的表现,我会用字典来索引存储到会更好实际存储对象的数组:

var myObjects = new LargeObjectClass[size]; 
var objectIndices = new Dictionary<string, int>(); 
var specificObject = myObjects[objectIndices["identifier"]]; 

这显然是一个不错的办法如果myObjects大小是事先未知的或可能在运行时改变,但由于字典是小,我读的地方,阵列更比字典更有效率,我认为这种方法可能在c中有更好的表现Ases的大小是固定的。

假设对象非常大,哪种方法更高效?

+0

为什么不自己测试一下呢?那么你肯定会知道。 – user469104

+4

在Dictionnary 中,该对象只是对原始对象的引用。对象未被克隆。因为int小于对象引用,所以使用int而不是对象“address”提供了小内存优势。但是,它在性能方面效率更高,因为跳过了一个间接方法。但是,所有的好处/缺点并不重要。作为结论,保持你的第一个方法,即对象的字典。 – Graffito

+1

@Graffito:在字典中使用整数可以使字典本身更小,但向需要存储所有对象引用的数组中添加数组只是将所有已保存的空间再次添加回来,对吧? – StriplingWarrior

回答

5

在这种情况下,最好使用Dictionary<>。请记住,词典和数组都只存储对大对象的引用,因为class实例是引用类型。因此,如果它存储int s,那么字典只会略小于存储任何对象。然后,这个小小的差异就会被你的数组本身存储对象引用的事实所掩盖,所以合并后的总数将会占用更多的空间,而不仅仅是一个字典。

如果数组允许您避免使用字典,它只会给您更好的性能。例如,如果您基于连续的int值而不是string s键入对象,则可能发生这种情况。但是在字典顶部添加一个数组在各方面都会变得更糟。

另外,作为一般规则,您应该使用最简单,最易维护的方法,直到出现性能问题。一个Dictionary<>是非常不可能导致任何性能问题,除非你调用它数百万次。

+0

我想你应该解释为什么字典会很好,即提及参考。 –

+0

我假设使用枚举或常量而不是字典是不是更好? – scenia

+0

@scenia:我们在谈论多少种可能的价值?在编译时是否已知所有可能的值?有可能用一个常量值索引的数组会给你稍微好一点的性能。你甚至可以创建一个带有字段的类来表示所有可能的值。但是,如果有大量的可能值,那么它可能会非常笨重。让我重申:你的首要任务应该是可维护性。在这部分代码中遇到性能问题的机会非常渺茫。 – StriplingWarrior