我有大约 3000 个不同的文件需要在游戏过程中的不同时间进行组织和检索。
我创建了自己的变量结构。
我正在考虑创建一本“词典”
在我的应用程序开始时,只需在游戏开始之前加载我的所有文件。
我想知道性能:包含这么多条目的字典会导致我的应用程序变慢吗?
较大的字典会使“TryGetValue”和“ContainsKey”运行速度变慢吗?
感谢您的建议!
只要密钥具有良好分布的哈希值,TryGetValue 和 ContainsKey 在该大小下应该相当快。
字典具有可索引数量的“桶”。当它通过键添加或查找值时,它将获取 GetHashCode() 返回的值,再次将其散列到小于存储桶的数量(通常是简单的东西,如取模,但未定义实现),并查看相关的存储桶。
该存储桶当前将有零个或多个项目。字典将使用 .Equals() 将每个项目与键进行比较。
找到正确的存储桶的第一步将在常数时间 O(1) 内完成。将键与存储桶中的键进行比较的第二位将在线性时间 O(n) 中,其中 n 仅与该存储桶中的项目数相关,而不与整个集合中的项目数相关。
一般来说,每个桶中的项目应该很少(桶的数量将增加以尽量保持这种情况),因此操作本质上是恒定时间。
然而,如果你的哈希码实现得不好,同一个桶中将会有很多键。时间复杂度将越来越接近 O(n),通过用一个故意设置不好的 GetHashCode 每次都返回 0 的对象进行实验可以看出。在最坏的情况下,它比 List 更糟糕,因为 List 也是 O(n),但 Dictionary 的开销更大。
这些是否意味着您应该担心?不,即使是相对简单的哈希方法也应该给出相对好的结果。如果您使用字符串键,那么它可能已经足够好了。如果您使用简单的内置类型,则更是如此。
如果您确实发现访问字典很慢,那么您需要注意这一点,并修复 GetHashCode() 方法或创建一个 IEqualityComparer(它允许您为 GetHashCode() 和 Equals() 定义外部规则,以便与字典、哈希集等)。
不过最有可能的是,3000没什么,没关系。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)