我有一个类叫ClassOne
。ClassOne
有两个方法,method1()
和method2()
,这两个方法都是静态的,将一个接一个地被调用(像这样):
ClassOne.method1();
ClassOne.method2();
这个序列保证不改变。
现在我想知道上面的情况和下面的情况是否有性能差异:
第二个案例:
method1(){
method2();
}
就性能而言,以任何一种方式进行方法调用都会产生相同的字节码,并且不会提供任何性能优势。
看一看这篇文章,以便更好地理解http://www.codeproject.com/Articles/30422/How-the-Java-Virtual-Machine-JVM-Works就使用哪种样式而言,它取决于每个方法执行的功能。如果method1()依赖于method2()执行的任务,那么你就把它耦合在一起,但如果它不依赖于method2(),并且method2()做了一些需要在method1()完成后执行的事情,那么你就把它们分开来保持关注点的分离。
我怀疑会有任何区别,主要是因为ClassOne是指向消息接收器的指针,而在第二种情况下,消息的接收器是作用域中的this对象,即类对象本身。然而,如果你想证明这一点,写一个简单的应用程序,调用两个空方法几百万次,并比较两种方法之间的平均时间。
您可以查看生成的字节码并自己得出结论:
源代码#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
}
生成的字节码与静态方法
不应该有任何性能差异。现在,如果method2()总是在method1()之后执行,那么最好使用Second Case
在这种情况下,您最好的选择是通过将"method2"的主体放在"method1"的末尾,并删除对"method2"的所有调用,并将"method1"重命名为反映它现在正在执行这两个操作的事实,以及重命名所有对"method1"的引用。