DataTable循环性能比较
时间:2020-03-05 18:38:17 来源:igfitidea点击:
以下哪项具有最佳性能?
我已经看到方法2在JavaScript中实现了巨大的性能提升,但是,我无法在Cand中衡量任何收益,我想知道编译器是否已经像方法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 }
解决方案
回答
不,它不能这样做,因为没有办法表示一个值随时间的常数。
如果编译器应该能够做到这一点,则必须保证代码返回该值,该值是恒定的,并且在循环期间不会更改。
但是,在这种情况下,我们可以自由地将新行添加到数据表中作为循环的一部分,因此,我们可以按照自己的方式来保证这一点。
简而言之,如果最终索引不是变量,则编译器将不会执行该优化。
在使用变量的情况下,编译器仅查看循环代码并看到此特定变量未更改,它可能会这样做,并在开始循环之前将值加载到寄存器中,但这样做会带来任何性能提升除非循环体为空,否则很可能会忽略不计。
结论:如果我们知道或者愿意接受end loop索引在循环持续时间内是恒定的,请将其放入变量中。
编辑:重新阅读文章,是的,由于JITter对代码进行了优化,因此两种情况下的性能提升也可以忽略不计。 JITter可能会将最终索引读取优化为直接访问包含行数的数据表中的变量,而内存读取无论如何都不是那么昂贵。另一方面,如果读取该属性是一项非常昂贵的操作,则我们会看到更明显的区别。