Java中嵌套方法调用的成本

时间:2012-01-24 00:54:56

标签: java methods nested invocation

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

例如,假设声明了以下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个已经实例化的对象thirdsecondfirst,以下呼叫的成本几乎相同?

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

如果方法的名称相同,它会对优化产生任何影响吗?

2 个答案:

答案 0 :(得分:4)

您是否担心方法调用开销?大多数时候,没有。只有当你有一个在循环中被大量调用的方法时,这个开销很重要。

通常,当你的方法所做的工作将花费在执行上的大部分时间时,纳秒的时差意味着下蹲。此外,正如您所提到的,Java HotSpot VM确实在适当的位置进行了方法调用的内联。然而,这个决定取决于VM。看到这个链接:

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

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

答案 1 :(得分:3)

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

与用户完全不同的差异,但仍然存在差异。