標題可能是誤導性的,但我不能用一個語句來包裝我的問題。使用obj.getXY()和Object之間的Java性能o = obj.getXY()
因爲我正在爲Android開發,所以我更關心性能。正因爲如此,我想過用
obj.getXY().doX();
obj.getXY().doY();
或
Object o = obj.getXY();
o.doX();
o.doY();
什麼是快? 做一個引用來調用所有的方法或總是使用getter?
標題可能是誤導性的,但我不能用一個語句來包裝我的問題。使用obj.getXY()和Object之間的Java性能o = obj.getXY()
因爲我正在爲Android開發,所以我更關心性能。正因爲如此,我想過用
obj.getXY().doX();
obj.getXY().doY();
或
Object o = obj.getXY();
o.doX();
o.doY();
什麼是快? 做一個引用來調用所有的方法或總是使用getter?
實際上第二個可能在2.3之前的Android版本中稍微快一點。 這也是非常有益的沒有在所有的getter和直接做
obj.xy.doX();
或
Object o = obj.xy;
o.doX();
o.doY();
第一個變種決不會比第二快,它等於
{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的兩倍快,因爲是可以預料的。
爲什麼不用簡單的基準檢查自己?我猜想第二種方法稍微快一點,特別是如果getter比簡單的return語句複雜一點。 – davin 2011-04-02 09:45:17
即使是蹩腳的Android JVM也會優化這兩者之間的差異。不要擔心。 – skaffman 2011-04-02 09:52:13
你應該擔心這種事情的唯一原因是,如果你有你的應用程序的配置文件,並且配置文件已經確定這樣做的方法是值得的微型優化。微「優化」的代碼是浪費時間。 – 2011-04-02 12:41:34