哪个更快:将算术参数传递给函数,或者在调用函数后计算算术?

时间:2012-12-23 10:32:40

标签: java performance function

我这里有两个功能。它们都具有相同的目的,但它们没有相同的参数设置。哪一个更快?提前谢谢。

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

2 个答案:

答案 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老手在性能方面也不相信他们的直觉。 始终在开始考虑瓶颈之前对您的代码进行分析。