从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

如果存在差异,在什么情况下使用一个而不是另一个?

提前感谢任何指导!

有帮助吗?

解决方案

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

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

所以你需要支付少量的开销。但是为了清楚起见,如果你只是在一行上工作,我仍然会坚持使用For Each,而你并没有修改数据集。

其他提示

实际上没有区别。虽然你在foreach方法中从技术上支付了一小笔费用,但是要通过IEnumerable接口。

第二个会有轻微的惩罚。但是就情况而言,我总是会使用方法2来清楚代码。但是,如果我需要在分析当前行时访问下一行/上一行,我会使用方法1。

嗯,这是有区别的,因为在foreach循环中调用的GetEnumerator和MoveNext是虚拟的(调用需要通过指针),因此无法内联。实际上这种开销很小,除非你做了一个很多的循环。

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

我个人更喜欢在我的ASP.NET MVC代码中使用foreach,正如许多人在这里所说的那样,但是通常也使用for循环。 Joe Duffy最近发布了一篇关于枚举成本的有趣文章 http://joeduffyblog.com/2008/09 / 21 /的-成本的-枚举-在网/

@ gdean232是对的 - 几乎没有任何区别。如果性能是个问题,那么使用SqlDataReader会更快。

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

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

很常见,编译器将其视为一种特殊情况并对其进行优化,因此它变得更快。但是,与该格式的任何小偏差(例如int len = MyArray.Count; for(int i = 0; i <!> lt; len; ++ i))将无法识别,并将使用较慢的代码

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top