-3

ここに2つの機能があります。それらはすべて同じ目的を持っていますが、同じパラメータ設定を持っていません。どちらが速いですか?前もって感謝します。

//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

の1回の呼び出しSystem.out.printlnは、プリミティブ加算操作よりも少なくとも3桁コストがかかるため、ループ内で何かを出力する関数を記述して、int加算について心配することは意味がありません。100番目のメンバーまでのテイラー級数展開で正弦関数を近似している可能性がありますが、2つのバージョンの関数の間に違いが見られる可能性はほとんどありません。

重要な点は、最も経験豊富なJavaのベテランでさえ、パフォーマンスに関しては本能を信頼していないということです。ボトルネックについて考え始める前に、常にコードのプロファイルを作成してください。

于 2012-12-23T11:06:49.503 に答える