我这里有两个功能。它们都具有相同的目的,但它们没有相同的参数设置。哪一个更快?提前谢谢。
//This function's purpose is to print x + y times.
//total = x + y
public void function(int total){
for (int i = 0; i < total; i++){
System.out.println("Hello.");
}
}
//This function is the same as the above.
//The value is calculated within a "for" loop
public void function(int x, int y){
for (int i = 0; i < x + y; i++){
System.out.println("Hello.");
}
}
public void main(String[] arg){
//Initial variables.
int x = 4;
int y = 6;
//First function call
function(x + y);
//Second function call
function(x, y);
}
答案 0 :(得分:2)
我实际上希望javac
优化x + y
的总和,但事实并非如此。所以这会在运行时留下其他改进,如JIT或AOT。
现在问题是你在哪里使用这个Java代码?在台式机,服务器,Android手机,Java卡上?如果你没有这样的关注,那么回答对你来说不是很重要。但是,如果你的目标是Java卡,那么你当然应该使用更好的卡。
(以下是来自javac / javap 1.7.0_09)
public void function(int);
Code:
0: iconst_0
1: istore_2
2: iload_2
3: iload_1
4: if_icmpge 21
7: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
10: ldc #3 // String Hello.
12: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
15: iinc 2, 1
18: goto 2
21: return
public void function(int, int);
Code:
0: iconst_0
1: istore_3
2: iload_3
3: iload_1
4: iload_2
5: iadd
6: if_icmpge 23
9: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
12: ldc #3 // String Hello.
14: invokevirtual #4 // Method java/io/PrintStream.println(Ljava/lang/String;)V
17: iinc 3, 1
20: goto 2
23: return
答案 1 :(得分:1)
对System.out.println
的一次调用比原始添加操作至少要贵三个数量级,因此编写一个在循环中打印内容并担心int添加的函数是没有意义的。你可以近似一个正弦函数,泰勒级数扩展到第100个成员,你仍然不太可能看到你的函数的两个版本之间存在差异。
重点是,即使是最有经验的Java老手在性能方面也不相信他们的直觉。 始终在开始考虑瓶颈之前对您的代码进行分析。