【问题标题】:Dictionary of large objects vs. Dictionary of array indices大对象字典与数组索引字典
【发布时间】:2015-07-01 20:07:06
【问题描述】:

我有想要通过字符串标识符访问的大型对象。我目前的方法是使用包含以下内容的字典:

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

现在我想知道在 Dictionary 中存储许多大型对象是否会对性能不利,我最好使用 Dictionary 将索引存储到实际存储对象的数组中:

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

如果myObjects 的大小事先未知或可能在运行时发生变化,这显然是一种不好的方法,但由于字典更小,而且我在某处读到数组比字典更有效,我认为这种方法可能有在大小固定的情况下性能更好。

假设对象非常大,这些方法中哪一种更有效?

【问题讨论】:

  • 为什么不自己测试一下呢?那你肯定会知道的。
  • 在Dictionnary中,对象只是对原始对象的引用。对象没有被克隆。使用 int 代替对象“地址”提供了小的内存优势,因为 int 小于对象引用。但是,它在性能方面更有效,因为跳过了一个间接。但是,所有的好处/坏处都不是很重要。作为结论,请保留您的第一种方法,即对象字典。
  • @Graffito:在字典中使用整数会使字典本身更小,但是向必须存储所有对象引用的数组添加一个数组只会再次增加所有节省的空间,对吗?跨度>
  • @StriplingWarrior:在场景代码中,对象存储在数组中,因此已经创建。
  • @StriplingWarrior:我读剧本的速度太快了。我对“实际存储对象的数组”感到困惑。我错误地假设对象最初是在数组(或列表)中加载的,并且字典用于创建索引。道歉...

标签: c# arrays dictionary


【解决方案1】:

在这种情况下,您最好只使用Dictionary&lt;&gt;。请记住,Dictionary 和 Array 都只存储对大对象的引用,因为 class 实例是引用类型。因此,如果 Dictionary 存储ints,它只会比存储任何对象时稍微小一点。然后,您的数组本身将存储对象引用这一事实掩盖了这一微小差异,因此合并后的总数将占用比字典更多的空间。

如果数组允许您完全避免使用字典,它只会给您带来更好的性能。例如,如果您基于连续的 int 值而不是 strings 为对象设置键,则可能会发生这种情况。但是在字典之上添加一个数组在各方面都会变得更糟。

此外,作为一般规则,您应该使用最简单、最易于维护的方法,直到遇到性能问题。 Dictionary&lt;&gt; 极不可能导致任何性能问题,除非您调用它数百万次。

【讨论】:

  • 我认为您应该解释一下为什么字典会很好,即提及参考文献。
  • 我假设使用枚举或常量而不是字典不是更好?
  • @scenia:我们讨论了多少个可能的值?并且在编译时是否知道所有可能的值?由常量值索引的数组可能会给您带来更好的性能。您甚至可能最好创建一个包含字段的类来表示所有可能的值。但是,如果有大量可能的值,那么它可能会变得非常笨拙。让我重申:您的首要任务应该是可维护性。您在这部分代码中遇到性能问题的可能性非常小。
  • @DavidArno:怎么样?
  • 密钥是通过自定义解析器类从文件创建的。所以几乎有无限的可能性。虽然只读取一个文件,但它不会有超过 100 个不同的值。我本来想在运行时创建一个枚举或定义常量,但现在我把它写出来,感觉很愚蠢......
猜你喜欢
  • 2018-07-06
  • 2019-09-21
  • 1970-01-01
  • 2020-12-06
  • 2021-01-12
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
  • 2022-10-26
相关资源
最近更新 更多