以下哪项具有最佳性能?

我已经看到在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 票数:5 已采纳

不,它不能这样做,因为没有办法随着时间的推移表达一个值。

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

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

简而言之,如果end-index不是变量,编译器将不会进行优化。

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

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


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

  ask by GateKiller translate from so

未解决问题?本站智能推荐: