3

我的假设是,通过编译器优化(例如,内联),方法是否“嵌套”几个级别实际上没有区别。真的会是这样吗?

例如,假设声明了以下 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,以下调用的成本实际上是否相同?secondfirst

third.test3();
third.test2();
third.test1();
second.test2();
second.test1();
first.test1();

如果方法的名称相同,优化会有什么不同吗?

4

2 回答 2

4

您应该担心方法调用开销吗?大多数时候,没有。只有当您有一个在循环中被大量调用的方法时,这种开销才重要。

通常,当您的方法正在执行的工作将是执行所花费的全部时间时,纳秒的时间差意味着蹲下。此外,正如您所提到的,Java HotSpot VM 确实在适当的情况下对方法调用进行内联。但是,该决定取决于 VM。请参阅此链接:

http://java.sun.com/developer/technicalArticles/Networking/HotSpot/inlining.html

如今,软件开发中有更好的事情需要担心。运送那个应用程序!

于 2012-01-24T01:09:48.760 回答
3

每个嵌套调用都将在调用堆栈上占据另一个位置。由于您在方法中没有做太多其他事情,这将构成调用方法的大部分“成本”,因此会有所作为。

对用户来说完全不明显的差异,但仍然存在差异。

于 2012-01-24T00:58:12.323 回答