在字典中维护数据局部性<TKey,TValue>
Maintaining data locality in a Dictionary<TKey,TValue>
我正在制作游戏,出于某些原因,我决定为每个游戏对象提供一个 int
实体 ID,这样我就可以轻松地搜索它们,而不必线性搜索列表或更糟, 许多列表。这个想法受到 ECS 模式的启发,我想如果我确保在销毁 int 时重新使用它们,这将有助于将所有数据在内存中靠近在一起并稍微减少缓存未命中。 (我知道这更多地取决于访问顺序,只是在这里抽象地思考)。问题是我现在怀疑自己,而且我读了很多书,以至于我无法在脑海中保持清晰的想法。
问题本质上是 如果我不停地向 Dictionary<int, SomeClass>
添加更高编号的键,speed/memory 的使用是否会比我尝试重新使用较低编号的键更糟?
注意:我觉得答案会是 "write your own class",但我试图避免这种情况,如果我不理解这个概念,我认为我不会做得很好。
不,完全没有区别。来自 MSDN:
The Dictionary generic class provides a mapping from a set of keys to a set of values. Each addition to the dictionary consists of a value and its associated key. Retrieving a value by using its key is very fast, close to O(1), because the Dictionary class is implemented as a hash table.
因此,速度将始终为 O(1),因为它在内部使用哈希 table,密钥的值根本不会影响它。
您唯一可能面临的问题是您是否达到 int.MaxValue
,这取决于您的场景。
好的,这是我自己尽力回答的问题,如果我有任何错误,请见谅。
简短回答:否。如果你添加更高的数字,它们就会卡在数组的某个地方,直到它被填满。示例问题的解决方案是用 GameObject
数组替换字典并使用 int 作为索引,如果需要,写一个 class 来处理扩展它。
更长的答案:我认为我的困惑来自于在某处读到字典只是一对平行数组或类似的东西。我想这是真的,但由于它是由哈希码索引的,因此它不适用于连续的索引值。所以它做了一堆多余的工作来处理我永远不会用它来处理的情况。
我正在制作游戏,出于某些原因,我决定为每个游戏对象提供一个 int
实体 ID,这样我就可以轻松地搜索它们,而不必线性搜索列表或更糟, 许多列表。这个想法受到 ECS 模式的启发,我想如果我确保在销毁 int 时重新使用它们,这将有助于将所有数据在内存中靠近在一起并稍微减少缓存未命中。 (我知道这更多地取决于访问顺序,只是在这里抽象地思考)。问题是我现在怀疑自己,而且我读了很多书,以至于我无法在脑海中保持清晰的想法。
问题本质上是 如果我不停地向 Dictionary<int, SomeClass>
添加更高编号的键,speed/memory 的使用是否会比我尝试重新使用较低编号的键更糟?
注意:我觉得答案会是 "write your own class",但我试图避免这种情况,如果我不理解这个概念,我认为我不会做得很好。
不,完全没有区别。来自 MSDN:
The Dictionary generic class provides a mapping from a set of keys to a set of values. Each addition to the dictionary consists of a value and its associated key. Retrieving a value by using its key is very fast, close to O(1), because the Dictionary class is implemented as a hash table.
因此,速度将始终为 O(1),因为它在内部使用哈希 table,密钥的值根本不会影响它。
您唯一可能面临的问题是您是否达到 int.MaxValue
,这取决于您的场景。
好的,这是我自己尽力回答的问题,如果我有任何错误,请见谅。
简短回答:否。如果你添加更高的数字,它们就会卡在数组的某个地方,直到它被填满。示例问题的解决方案是用 GameObject
数组替换字典并使用 int 作为索引,如果需要,写一个 class 来处理扩展它。
更长的答案:我认为我的困惑来自于在某处读到字典只是一对平行数组或类似的东西。我想这是真的,但由于它是由哈希码索引的,因此它不适用于连续的索引值。所以它做了一堆多余的工作来处理我永远不会用它来处理的情况。