C# 数据集行/列查找的速度?

C# 数据集行/列查找的速度?,c#,.net,optimization,datatable,C#,.net,Optimization,Datatable,最近,我不得不用存储在数据集中的数据做一些非常繁重的处理工作。它很重,以至于我最终使用了一个工具来帮助识别代码中的一些瓶颈。当我分析瓶颈时,我注意到,尽管数据集查找并不是非常慢(它们不是瓶颈),但比我预期的要慢。我总是假设数据集使用某种哈希表样式的实现,这将使查找成为O(1)(或者至少我认为哈希表就是这样)。我的查找速度似乎比这要慢得多 我想知道是否有人知道.NET的DataSet类的实现,愿意分享他们所知道的 如果我这样做: DataTable dt = new DataTable(); if

最近,我不得不用存储在数据集中的数据做一些非常繁重的处理工作。它很重,以至于我最终使用了一个工具来帮助识别代码中的一些瓶颈。当我分析瓶颈时,我注意到,尽管数据集查找并不是非常慢(它们不是瓶颈),但比我预期的要慢。我总是假设数据集使用某种哈希表样式的实现,这将使查找成为O(1)(或者至少我认为哈希表就是这样)。我的查找速度似乎比这要慢得多

我想知道是否有人知道.NET的DataSet类的实现,愿意分享他们所知道的

如果我这样做:

DataTable dt = new DataTable();
if(dt.Columns.Contains("SomeColumn"))
{
    object o = dt.Rows[0]["SomeColumn"];
}
Contains(…)
方法的查找时间和检索要存储在
对象o
中的值的查找时间有多快?我本以为它会像哈希表一样快(假设我对哈希表的理解是正确的),但它看起来不像


我是从内存中编写代码的,所以有些东西可能“语法不正确”。

我认为任何查找都是O(n),因为我认为它们不会使用任何类型的哈希表,但实际上会使用更多的数组来查找行和列。

事实上,我相信列名存储在哈希表中。对于区分大小写的查找,应为O(1)或常量查找。如果它必须查看每个列,那么当然是O(n)。

实际上,在引用列时建议使用整数,这可以大大提高性能。为了便于管理,可以声明常量整数。所以你可以做的不是你所做的,而是你所能做的

const int SomeTable_SomeColumn = 0;

DataTable dt = new DataTable();
if(dt.Columns.Contains(SomeTable_SomeColumn))
{
    object o = dt.Rows[0][SomeTable_SomeColumn];
}
通过DataRow[“ColumnName”]的步骤包括:

  • 从ColumnName获取数据列。使用行的DataColumnCollection[“ColumnName”]。在内部,DataColumnCollection将其DataColumns存储在Hastable中。O(1)
  • 获取数据行的行索引。索引存储在内部成员中。O(1)
  • 使用DataColumn[index]在索引处获取DataColumn的值。DataColumn将其数据存储在System.data.Common.DataStorage(内部、抽象)成员中:

    返回dataColumnInstance.\u storage.Get(recordIndex)

    示例具体实现是System.Data.Common.StringStorage(内部,密封)。StringStorage(以及我检查的其他具体数据存储)将它们的值存储在一个数组中。Get(recordIndex)只是在recordIndex处获取值数组中的对象。O(1)

  • 因此,总体而言,您是O(1),但这并不意味着操作期间的哈希和函数调用是免费的。这只是意味着它不会随着数据行或数据列数量的增加而增加成本

    有趣的是,DataStorage使用数组作为值。无法想象在添加或删除行时重建会很容易。

    这将是O(n^2),因为您正在对每个项进行字符串比较。