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