2011-04-02 33 views
1

標題可能是誤導性的,但我不能用一個語句來包裝我的問題。使用obj.getXY()和Object之間的Java性能o = obj.getXY()

因爲我正在爲Android開發,所以我更關心性能。正因爲如此,我想過用

obj.getXY().doX(); 
obj.getXY().doY(); 

Object o = obj.getXY(); 
o.doX(); 
o.doY(); 

什麼是快? 做一個引用來調用所有的方法或總是使用getter?

+0

爲什麼不用簡單的基準檢查自己?我猜想第二種方法稍微快一點,特別是如果getter比簡單的return語句複雜一點。 – davin 2011-04-02 09:45:17

+1

即使是蹩腳的Android JVM也會優化這兩者之間的差異。不要擔心。 – skaffman 2011-04-02 09:52:13

+0

你應該擔心這種事情的唯一原因是,如果你有你的應用程序的配置文件,並且配置文件已經確定這樣做的方法是值得的微型優化。微「優化」的代碼是浪費時間。 – 2011-04-02 12:41:34

回答

1

實際上第二個可能在2.3之前的Android版本中稍微快一點。 這也是非常有益的沒有在所有的getter和直接做

obj.xy.doX(); 

Object o = obj.xy; 
o.doX(); 
o.doY(); 

the docs

3

第一個變種決不會比第二快,它等於

{Object tmp = obj.getXY(); tmp.doX();} 
{Object tmp = obj.getXY(); tmp.doY();} 

如果getXY() i (例如只是返回一個常量),最後,好的編譯器會優化雙重調用。在所有其他情況下,額外的方法調用會使其變慢。

由於無論如何第二個版本更具可讀性,所以我會選擇它。但是,正如其他人所指出的那樣,除非getXY()是複雜的,否則這種微型優化不會對程序的性能產生明顯的影響。

只是測試它(doX()/doY()是空操作,OpenJDK6在x64):

Integer getXY(){return 42;}:沒有noticable差異
Integer getXY(){return Integer.valueOf("42");}:變2的兩倍快,因爲是可以預料的。

相關問題