DataTable循环性能比较

13

以下哪个性能最好?

我看到方法2在JavaScript中实现时有很大的性能提升,但是我无法在C#中测量到任何提升,想知道编译器是否已经像方法1一样实现了方法2。

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

方法1

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

方法二

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

6

不行,因为没有办法表达值的随时间恒定

如果编译器要能够做到这一点,必须从返回该值的代码中保证该值是常量,并且在循环期间不会改变。

但在这种情况下,您可以在循环中添加新行到数据表中,因此您需要以您所做的方式保证它。

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

对于变量的情况,编译器可以查看循环代码并看到特定变量未更改,然后在开始循环之前将其加载到寄存器中,但除非您的循环体为空,否则任何性能收益都可能微不足道。

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


编辑: 重新阅读您的帖子,是的,您也可能会看到两种情况下的微不足道的性能提升,因为JITter会优化代码。 JITter可能会将您的结束索引读取优化为直接访问包含行数的数据表内变量的直接访问,而内存读取并不那么昂贵。另一方面,如果读取该属性是非常昂贵的操作,则会看到更明显的差异。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接