-3

我这里有两个功能。它们都有相同的用途,但它们的参数设置不同。哪个更快?提前致谢。

//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);
}
4

2 回答 2

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        
于 2012-12-23T10:46:27.187 回答
1

一次调用System.out.println至少比原始加法操作成本高出三个数量级,因此编写一个在循环中打印某些内容并担心 int 加法的函数是没有意义的。您可以通过泰勒级数展开到第 100 个成员来近似正弦函数,并且您仍然不太可能看到函数的两个版本之间的差异。

要点是,即使是最有经验的 Java 资深人士,在性能方面也不相信他们的直觉。在开始考虑瓶颈之前,请始终分析您的代码。

于 2012-12-23T11:06:49.503 回答