数据表循环性能比较

以下哪项具有最佳性能?

我已经看到了用JavaScript实现的方法2,性能有很大的提高,但是,我无法测量C#中的任何增益,并且想知道编译器是否已经像方法1那样编写了方法2。

方法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
}
0

1 答案

不,它不能这样做,因为没有办法为一个值表示常量

如果编译器应该能够做到这一点,那么就必须保证返回值的代码不变,并且在循环期间不会改变。

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

所以简而言之,如果最终索引不是变量,编译器将不会执行该优化。

在变量的情况下,编译器只需查看循环代码并查看该特定变量未被更改,就可以这样做,并在启动循环之前将该值加载到寄存器中,但是由此产生的任何性能增益很可能可以忽略不计,除非你的循环体是空的。

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


Edit: Re-read your post, and yes, you might see negligible performance gains for your two cases as well, because the JITter optimizes the code. The JITter might optimize your end-index read into a direct access to the variable inside the data table that contains the row count, and a memory read isn't all that expensive anyway. If, on the other hand, reading that property was a very expensive operation, you'd see a more noticable difference.

0
额外