可能重复:
for loop optimization
假设我们想循环遍历字符串s
中的字符。我认为以下代码是默认的。
for( int i = 0; i < s.length(); i++ ) {
doSomethingWith( s.charAt( i ) );
}
问题1:为什么我经常看到以下内容?
final int length = s.length();
for( int i = 0; i < length; i++ ) {
doSomethingWith( s.charAt( i ) );
}
乍一看,这似乎是合理的,因为不等式在每次迭代中都会被评估。然而,我认为VM应该会对此进行优化,因为字符串是不可变的。您有什么想法?如果我们遍历一个可变结构(没有被任何其他线程引用),会发生什么?如果length()不能保证以O(1)运行呢?
问题#2:有些人似乎认为将++i替换为i++可以加快代码速度。他们是对的吗?同样,这不是我所期望的,但我并不确定。
我们都知道不要过早优化。同时,如果我们可以在几乎没有任何代价的情况下产生稍微快一点的代码,那么我们就不应该愚蠢地放弃。当然,有人可能会说这两个“优化”都会影响可读性,但我认为这种损害非常小,在某些情况下是合理的。
我试图测量任何性能差异,但很难得出确切的结果。虽然这应该解决任何特定应用程序的问题,但我在这里的目标是洞察力和一个普遍的答案。
(尽管我写这篇文章时考虑了HotSpot VM,但也可以考虑其他平台,比如移动设备。)