可能重复:
for循环优化
假设我们要遍历 string 的字符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,但考虑其他平台也可能很有趣,比如移动设备。)