Gat*_*ler 12 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
}
Run Code Online (Sandbox Code Playgroud)
方法2
for (int i = 0, c = DataTable.Rows.Count; i < c; i++) {
// Do Something
}
Run Code Online (Sandbox Code Playgroud)
不,它不能这样做,因为没有办法表示一个值随时间的常数。
如果编译器应该能够做到这一点,则必须保证代码返回该值,该值是恒定的,并且在循环期间不会更改。
但是,在这种情况下,您可以自由地将新行添加到数据表中作为循环的一部分,因此,您可以按照自己的方式来做出保证。
简而言之,如果最终索引不是变量,则编译器将不会执行该优化。
在使用变量的情况下,编译器仅查看循环代码并看到此特定变量未更改,它可能会这样做,并在开始循环之前将值加载到寄存器中,但是这样做会带来任何性能提升除非循环体为空,否则很可能会忽略不计。
结论:如果您知道或愿意接受结束循环索引在循环持续时间内是恒定的,请将其放入变量中。
编辑:重新阅读您的文章,是的,由于JITter对代码进行了优化,因此您在两种情况下的性能提升也可以忽略不计。JITter可能会将您的最终索引读取优化为直接访问包含行数的数据表中的变量,而内存读取无论如何都不是那么昂贵。另一方面,如果读取该属性是一项非常昂贵的操作,则您会看到更明显的区别。