【问题标题】:.NET Fastest way to iterate through rows in a datatable?.NET 迭代数据表中行的最快方法?
【发布时间】:2010-09-16 05:24:41
【问题描述】:

从 DataTable 读取/比较行信息时,通常哪个最快?

'assume dt as datatable'

'method 1'
dim i as int32
for i = 0 to dt.rows.count - 1
   ....
next

'method 2'
dim row as datarow
for each row in dt.rows
    ....
next

如果有区别,在什么情况下使用其中一种而不是另一种?

提前感谢您的指导!

【问题讨论】:

    标签: .net performance ado.net datatable iteration


    【解决方案1】:

    嗯,这是有区别的,因为在 foreach 循环中调用的 GetEnumerator 和 MoveNext 是虚拟的(调用需要通过指针),因此不能内联。这种开销实际上很小,除非您执行 很多 循环。

    在某些情况下,尽管编译器会将 foreach 替换为 for 循环(我相信在迭代数组时)。

    为了清晰起见,我个人更喜欢在我的 ASP.NET MVC 代码中使用 foreach,正如许多人在这里所说的那样,但也经常使用 for 循环。 Joe Duffy 最近发表了一篇关于枚举成本的有趣文章 http://joeduffyblog.com/2008/09/21/the-cost-of-enumerating-in-net/

    【讨论】:

      【解决方案2】:

      foreach 的实现实际上比标准的实现略快,因为每个索引数组的访问都需要进行边界检查。但是,由于成语:

      for(int i =0; i < myArray.Count; ++i)
      {
          // do something with myArray[i];
      }
      

      很常见,编译器会寻找它作为特例并对其进行优化,因此它变得更快。但是,任何与该格式的微小偏差(例如 int len = MyArray.Count; for(int i =0; i

      【讨论】:

        【解决方案3】:

        编译器将 For Each 扩展为一个短暂的 while 循环。

        for each row in dt.rows
        // expands to:
        IEnumerator e = dt.rows.GetEnumerator()
        while e.MoveNext()
            row = e.Current
        

        因此,您需要支付少量的间接费用。但是为了清楚起见,如果您只处理一行并且不修改数据集,我仍然会坚持使用 For Each。

        【讨论】:

          【解决方案4】:

          @gdean232 是对的——几乎没有区别。如果性能是一个问题,使用 SqlDataReader 会明显更快。

          【讨论】:

            【解决方案5】:

            第二个将受到轻微处罚。但是,就情况而言,为了代码的清晰,我总是会使用方法 2。但是,如果我需要在分析当前行时访问下一行/上一行等操作,我会使用方法 1。

            【讨论】:

              【解决方案6】:

              实际上没有区别。虽然从技术上讲,您在 foreach 方法中为通过 IEnumerable 接口付出了很小的代价。

              【讨论】:

              • 是的,在我的测试工具中,这两种方法仅在大约 10 万次迭代后才显示出性能差异。
              猜你喜欢
              • 2019-04-08
              • 2013-10-23
              • 2013-10-01
              • 2022-06-13
              • 1970-01-01
              • 1970-01-01
              • 2010-11-08
              • 2023-04-11
              • 2014-12-02
              相关资源
              最近更新 更多