2012-07-14 85 views
2

在Java代码中,我觉得这样的:在for声明中调用.length()比在循环之前调用慢?

for (int i = 0; i < s.length(); i++) { 
    // do a lot of something 
} 

比这更慢:

int length = s.length(); 
for (int i = 0; i < length; i++) { 
    // do a lot of something 
} 

请告诉我,我是否正确。

+0

最有可能不是。 – assylias 2012-07-14 22:24:02

+3

's'的类型是什么? – 2012-07-14 22:35:51

+0

它取决于's.length()'的实现。什么是's'? – 2012-07-15 04:07:47

回答

7

理论上,第一个代码示例可能会比较慢,因为它在每次迭代中调用s.length()一次。但是有可能JVM会为你优化第一段代码。使用更简单的方法,除非基准测试显示:

  1. 您处于性能至关重要的一段代码。
  2. 在本地变量中存储长度实际上确实会加快速度。
+0

我想这取决于什么''是。这可能是因为's'是某种堆栈,并且随着循环的迭代而增长 - 在这种情况下,尝试进行JVM优化可能实际上会改变程序逻辑。 JVM首先必须确定'length()'方法只返回一个不可变属性,而's'本身至少被视为'final'。 – ziesemer 2012-07-14 22:36:48

+1

应该注意的是,通常应该将for循环写为'for(int i = 0,length = s.length; i Voo 2012-07-14 22:51:39