我的假设是,通过编译器优化(例如,内联),一个方法是否“嵌套”几个级别几乎没有区别。那确实是这样吗?
例如,假设声明了以下3个类:
public class Third extends Second
{
public int test3() // Call test2() and nothing else
{
return super.test2();
}
}
public class Second extends First
{
public int test2()
{
return super.test1(); // Call test1() and nothing else
}
}
public class First
{
public int test1() // Calculate a result somehow
{
int result = 0;
...
return result;
}
}
鉴于3个已经实例化的对象third
,second
和first
,以下呼叫的成本几乎相同?
third.test3();
third.test2();
third.test1();
second.test2();
second.test1();
first.test1();
如果方法的名称相同,它会对优化产生任何影响吗?
答案 0 :(得分:4)
您是否担心方法调用开销?大多数时候,没有。只有当你有一个在循环中被大量调用的方法时,这个开销很重要。
通常,当你的方法所做的工作将花费在执行上的大部分时间时,纳秒的时差意味着下蹲。此外,正如您所提到的,Java HotSpot VM确实在适当的位置进行了方法调用的内联。然而,这个决定取决于VM。看到这个链接:
http://java.sun.com/developer/technicalArticles/Networking/HotSpot/inlining.html
如今,在软件开发方面还有更好的事情要担心。运送那个应用程序!
答案 1 :(得分:3)
每个嵌套调用将占用调用堆栈上的另一个位置。由于你在方法中没有做太多其他事情,这将占调用你的方法的“成本”的大部分,所以它会有所作为。
与用户完全不同的差异,但仍然存在差异。