2

我有课说ClassOneClassOne有两个方法说method1(),并且这method2()两个方法都是静态的,将一个接一个地被调用(像这样):

ClassOne.method1();
ClassOne.method2();

这个顺序保证不会改变。

现在我想知道上述情况和以下情况是否有任何性能差异:

第二种情况:

method1(){
    method2();
}
4

5 回答 5

3

在性能方面,以任何一种方式进行方法调用都会产生相同的字节码,并且不会提供任何性能优势。

看看这篇文章以更好地理解 http://www.codeproject.com/Articles/30422/How-the-Java-Virtual-Machine-JVM-Works

至于使用哪种风格,这取决于每种方法执行的功能。如果 method1() 依赖于 method2() 执行的任务,那么你将它耦合到一边,但如果它不耦合,并且 method2() 做了一些需要在 method1() 完成后执行的事情,那么你将它们分开以维护关注点分离。

于 2013-01-18T15:46:16.917 回答
2

我怀疑会有什么区别,主要是因为 ClassOne 是指向消息接收者的指针,而在第二种情况下,消息的接收者是范围内的 this 对象,即类对象本身。但是,如果您想证明这一点,请编写一个简单的应用程序,该应用程序调用两个空方法数百万次,并比较两种方法之间的平均时间。

于 2013-01-18T15:44:50.177 回答
2

您可以查看生成的字节码并自行得出结论:

源代码#1

public class Clazz {

    public static void main(String[] args){
        Clazz.method1();
        Clazz.method2();
    }

    public static void method1() {

    }

    public static void method2() {

    }
}

字节码 #1

Compiled from "Clazz.java"

public class Clazz {
  public Clazz();
    Code:
       0: aload_0
       1: invokespecial #8                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: invokestatic  #16                 // Method method1:()V
       3: invokestatic  #19                 // Method method2:()V
       6: return

  public static void method1();
    Code:
       0: return

  public static void method2();
    Code:
       0: return
}

源代码#2

public class Clazz {

    public static void main(String[] args){
        Clazz.method1();
    }

    public static void method1() {
        method2();
    }

    public static void method2() {

    }
}

字节码 #2

Compiled from "Clazz.java"

public class Clazz {
  public Clazz();
    Code:
       0: aload_0
       1: invokespecial #8                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: invokestatic  #16                 // Method method1:()V
       3: return

  public static void method1();
    Code:
       0: invokestatic  #21                 // Method method2:()V
       3: return

  public static void method2();
    Code:
       0: return
}


结果

静态方法生成的字节码相同

于 2013-01-18T16:09:00.537 回答
1

应该没有任何性能差异。现在如果method2()总是在method1()之后执行,最好使用Second Case。

于 2013-01-18T15:37:53.297 回答
1

在这种情况下,您最好的选择就是通过将“method2”的主体放在“method1”的末尾来重构它,并删除对“method2”的所有调用,并将“method1”重命名为反映以下事实的名称它现在正在执行这两项操作,并将所有引用重命名为“method1”。

于 2013-01-18T15:42:18.790 回答