2012-07-14 66 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