强类型数据集是否可以提高性能?

时间:2009-02-09 15:43:06

标签: c# .net performance dataset strongly-typed-dataset

在我工作的地方,我们终于想到使用强类型数据集将我们的一些查询封装到sqlserver。我一直在吹嘘的一个想法是强类型列的强度,主要是因为不需要转换任何数据。我认为强类型数据集会在以下可能存在数千行的情况下提高性能,这是错误的吗?

老路:

using(DataTable dt = sql.ExecuteSomeQuery())
{
    foreach (DataRow dr in dt.Rows)
    {
        var something = (string)dr["something"];
        var somethingelse = (int)dr["somethingelse"];
    }
}

新方式:

MyDataAdapter.Fill(MyDataset);
foreach (DataRow dr in MyDataset.MyDT.Rows)
{
    var something = dr.Something;
    var somethingelse = dr.SomethingElse;
}

如果属性真的只是在幕后进行投射,我可以看到根本不会有任何加速;或许它需要更长的时间才能获得函数调用的开销。

使用我们应该了解的DataSet还有其他任何性能优势/劣势吗?

谢谢!

6 个答案:

答案 0 :(得分:7)

我不确定使用强类型数据集是否会有任何性能改进,但是您可以获得添加的类型安全性,例如,当您输入字段名称时,会出现编译错误。

MSDN magazine中有一篇关于它们的文章,引用其中的一行:

  

访问类型化DataSet的速度与访问非类型化DataSet的速度更快(因为类型化DataSet只是无类型DataSet上的层)并且类型化DataSet的可读性最佳

此外,正如斯图尔特B所指出的那样,仅凭智能感知就值得。

答案 1 :(得分:6)

如果查看为类型化数据集生成的代码,可以看到每个类型化调用下的是使用字符串索引名称进行的调用。因此,他们确实没有提供性能提升,只提供类型安全性。

然而,我对键入的数据集中的可空字段抱有很大的抱怨。具体来说,如果您访问一个为null的int字段,则会抛出异常..您必须首先调用IsMyfieldNull()调用以确定它是否为null,并且如果是,则避免引用它。一个真正的解决方案是允许可空类型字段,因此您不会冒险只为触摸字段而抛出异常的风险。我心中的这个缺陷几乎否定了强力打字的好处。

答案 2 :(得分:4)

不要忘记Intellisense。好吃。

答案 3 :(得分:2)

强类型DataSet只是一个强类型的包装器,它与你原本使用的相同的无类型DataSet相比。假设您将以合理,有效的方式使用非类型化DataSet,强类型DataSet将不会更快(执行方式)。

答案 4 :(得分:1)

从技术上讲,创建强类型数据集应该有小的性能影响。尽管如此,创建强类型数据集会带来很多好处。在可维护性和编程方面。在Intellisense之上,如果您的数据访问层发生了某些变化,您将不必搜索“第1列”之类的所有内容。您只需要更改实际为对象分配值的位置。

这类似于'是值得性能打击的linq'。它的速度较慢,但​​速度的提高值得提高生产力水平。

答案 5 :(得分:1)

是的,使用强类型数据集有一个好处 - 那就是来自列查找。按名称查找列比按类型查找列要慢。为强类型数据集生成的代码按类型查找列,因此您可以获得一些性能提升。