2011-04-02 14 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的两倍快,因为是可以预料的。

相关问题