在Java中使用obj.getXY()和对象o=obj.getXY()之间的性能

在Java中使用obj.getXY()和对象o=obj.getXY()之间的性能,java,android,performance,reference,Java,Android,Performance,Reference,标题可能有误导性,但我不能用一句话来回答我的问题 因为我是为Android开发的,所以我更担心性能。正因为如此,我考虑使用 obj.getXY().doX(); obj.getXY().doY(); 或 Object o = obj.getXY(); o.doX(); o.doY(); 什么更快? 引用调用所有方法或始终使用getter?实际上,在2.3之前的Android版本中,第二个可能会快一点。 在这里,根本不使用getter,直接使用getter甚至是有益的 obj.xy.doX

标题可能有误导性,但我不能用一句话来回答我的问题

因为我是为Android开发的,所以我更担心性能。正因为如此,我考虑使用

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

Object o = obj.getXY();
o.doX(); 
o.doY();
什么更快?
引用调用所有方法或始终使用getter?

实际上,在2.3之前的Android版本中,第二个可能会快一点。 在这里,根本不使用getter,直接使用getter甚至是有益的

obj.xy.doX();


请参见

实际上,在2.3之前的Android版本中,第二个可能要快一点。 在这里,根本不使用getter,直接使用getter甚至是有益的

obj.xy.doX();


参见

第一种变体永远不会比第二种快,它等于

{Object tmp = obj.getXY(); tmp.doX();}
{Object tmp = obj.getXY(); tmp.doY();}
如果
getXY()。在所有其他情况下,一个额外的方法调用会使它变慢

既然第二个版本更具可读性,我还是选择它。但是,正如其他人所指出的,除非
getXY()
很复杂,否则这种微优化不会对程序的性能产生明显的影响

刚刚测试了它(
doX()
/
doY()
不是ops,而是x64上的OpenJDK6):

Integer getXY(){return 42;}
:无明显差异

Integer getXY(){return Integer.valueOf(“42”);}
:变量二的速度大约是预期的两倍。

第一个变量永远不会比第二个快,它等于

{Object tmp = obj.getXY(); tmp.doX();}
{Object tmp = obj.getXY(); tmp.doY();}
如果
getXY()。在所有其他情况下,一个额外的方法调用会使它变慢

既然第二个版本更具可读性,我还是选择它。但是,正如其他人所指出的,除非
getXY()
很复杂,否则这种微优化不会对程序的性能产生明显的影响

刚刚测试了它(
doX()
/
doY()
不是ops,而是x64上的OpenJDK6):

Integer getXY(){return 42;}
:无明显差异

Integer getXY(){return Integer.valueOf(“42”);}
:变量2的速度大约是预期的两倍。

为什么不用一个简单的基准来检查自己呢?我想第二种方法会稍微快一点,特别是如果getter比简单的return语句稍微复杂一点的话。即使是蹩脚的Android JVM也会优化这两种方法之间的差异。别担心。你应该担心这类事情的唯一原因是你是否已经对你的应用程序进行了概要分析,并且概要文件已经确定了值得进行微优化的方法。“很少”运行的微优化代码是浪费时间。为什么不用一个简单的基准测试来检查自己呢?我想第二种方法会稍微快一点,特别是如果getter比简单的return语句稍微复杂一点的话。即使是蹩脚的Android JVM也会优化这两种方法之间的差异。别担心。你应该担心这类事情的唯一原因是你是否已经对你的应用程序进行了概要分析,并且概要文件已经确定了值得进行微优化的方法。“很少”运行的微优化代码是浪费时间。