我正在为导入导出测试创建一个模拟数据库(算法读取和写入我们的数据库的复杂数据结构,而不仅仅是测试 IO 操作),并试图决定是否使用 DataSet 来存储模拟表(按表name) 在虚假数据库中,或 Dictionary()
在按名称检索数据表方面,我希望从 dataset.Tables["TableName"] 或 dictionary<"TableName"> (来自 Dictionary() 中获得更好的性能吗?
我正在为导入导出测试创建一个模拟数据库(算法读取和写入我们的数据库的复杂数据结构,而不仅仅是测试 IO 操作),并试图决定是否使用 DataSet 来存储模拟表(按表name) 在虚假数据库中,或 Dictionary()
在按名称检索数据表方面,我希望从 dataset.Tables["TableName"] 或 dictionary<"TableName"> (来自 Dictionary() 中获得更好的性能吗?
实际上,由于执行字典逻辑(哈希、桶等)的固有复杂性,Dictionary<,>
通常比线性搜索慢。在我的测试中,截止(Dictionary<,>
开始变得更快)通常在 150 个元素左右。而且由于您的表通常少于 150 个,因此我很乐意使用线性列表来提高性能。
(这根本不意味着“不要使用Dictionary<T>
;它只是意味着性能可能不是这个特定用例的主要原因;唯一的密钥执行和 foo["bar"] 模型可能是)
部分原因是获取哈希的复杂性 -特别是GetHashCode()
forstring
相对昂贵(尽管int.GetHashCode()
速度非常快;-p)。
实际上,在大多数小型数据集中,您永远不会注意到两者之间的差异。如果您有大量数据,那么显然您需要对此进行计划并进行相应的编码。
Dictionary<,>
a和类似 a的其他区别List<>
是唯一性:aDictionary<,>
不会让您拥有重复的键(尽管Lookup<,>
.NET 3.5 中的 a 会)。
DataSet.Tables 在内部使用 ArrayList 实现。按名称查找表涉及对列表中的表进行线性搜索和大量转换。因此,使用基于散列的通用字典几乎肯定会更快。(虽然你需要很多表和/或很多访问才能产生很大的不同。)