DataTable循环性能比较

时间:2008-08-07 10:01:05

标签: c# performance loops

以下哪项表现最佳?

我已经看到在JavaScript中实现的方法二具有巨大的性能提升,但是,我无法测量C#中的任何增益,并且想知道编译器是否已经执行方法2,即使编写方法1也是如此。

方法2背后的理论是代码不必在每次迭代时访问DataTable.Rows.Count,它可以简单地访问int c。

方法1

for (int i = 0; i < DataTable.Rows.Count; i++) {
    // Do Something
}

方法2

for (int i = 0, c = DataTable.Rows.Count; i < c; i++) {
    // Do Something
}

1 个答案:

答案 0 :(得分:4)

不,它无法做到这一点,因为没有办法为某个值表达随时间变化

如果编译器应该能够这样做,则必须保证代码返回值为常量的值,并且循环的持续时间不会改变。

但是,在这种情况下,您可以自由地将新行添加到数据表中作为循环的一部分,因此您可以按照自己的方式进行保证。

简而言之,如果结束索引不是变量,编译器就不会进行优化。

对于变量,编译器只能查看循环代码并看到此特定变量未更改,它可能会这样做并在启动循环之前将值加载到寄存器中,但是任何性能除非你的循环体是空的,否则从中获得的收益很可能是微不足道的。

结论:如果您知道或者愿意接受,结束循环索引在循环期间是恒定的,则将其放入变量中。


编辑:重新阅读您的帖子,是的,您可能会发现两种情况的性能提升可以忽略不计,因为JITter会优化代码。 JITter可能会优化您的最终索引读取,直接访问包含行计数的数据表中的变量,并且内存读取并不是那么昂贵。另一方面,如果读取该属性是一项非常昂贵的操作,您会看到更明显的差异。