8

int a=a+1usingとa++inの間にパフォーマンスの違いはありますJavaか?

もしそうなら、どちらがより良いですか、そしてその理由は何ですか? これを理解するために簡単に説明していただけますか?

4

6 に答える 6

15

まず第一に、Java言語仕様はタイミングについて何も述べていません。しかし、Suns javacなどの一般的なコンパイラを使用していると仮定すると、上記のすべての例(、、、、a++)は次のようにコンパイルできることがわかります。++aa += 1a = a + 1

  • iinc命令、変数の操作:

    iload_<variable>
    iinc <variable>, 1
    istore_<variable>
    
  • iaddスタックを使用した命令(ここでは変数1をストレージとして使用):

    iload_1
    iconst_1
    iadd
    istore_1
    

それらをコンパイルするための最良の方法を選択するのはコンパイラー次第です。たとえば、それらの間に違いはありません。そして、それはステートメント間の違いであってはなりません-それらはすべて同じことを表現しています-数字に1を足します。

そうは言っても、iinciaddバージョンの両方をJITを使用して高速でプラットフォームに依存するものにコンパイルでき、最終的には通常のランタイムが両方のバージョンを同じアセンブラーコードにコンパイルすると思います。


私のコンパイラでは、*jdk1.6.0_20*「インクリメント」メソッドも同じ命令を使用します。

public class Test {
    public static void main(String[] args) {

        int a = 0;

        a = a + 1;
        a += 1;
        a++;
        ++a;
    }
}

これは分解です:

Compiled from "Test.java"
public class Test extends java.lang.Object{
public Test();
  Code:
   0:   aload_0
   1:   invokespecial   #8; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(java.lang.String[]);
  Code:
   0:   iconst_0
   1:   istore_1
   2:   iinc    1, 1   // a = a + 1;
   5:   iinc    1, 1   // a += 1;
   8:   iinc    1, 1   // a++;
   11:  iinc    1, 1   // ++a;
   14:  return

}
于 2012-02-15T11:27:36.853 に答える
3

生成されたバイトコードを見る:

public static void main(String[] args) {
    int x = 1;
    int y = 1;
    int z = 1;
    int a = 1;
    int b = 1;
    x = x + 1;
    y++;
    ++z;
    a += 1;
    b += 2;
}

を生成する (を使用javap -c classname)

0:   iconst_1
1:   istore_1
2:   iconst_1
3:   istore_2
4:   iconst_1
5:   istore_3
6:   iconst_1
7:   istore  4
9:   iconst_1
10:  istore  5
12:  iload_1
13:  iconst_1
14:  iadd
15:  istore_1
16:  iinc    2, 1
19:  iinc    3, 1
22:  iinc    4, 1
25:  iinc    5, 2
28:  return

(jdk1.6.0_18)を使用して:

x = x + 1

作成します

12:  iload_1
13:  iconst_1
14:  iadd
15:  istore_1

一方

y++;
++z;
a += 1;

すべての結果

iinc

ただし、私のラップトップで大まかなパフォーマンス テストを行ったところ、2 つの実行時間にほとんど差がないという結果になりました (++x の方が速い場合もあれば、x=x+1 の方が速い場合もあります)。パフォーマンスへの影響については心配しません。 .

于 2012-02-15T11:55:24.973 に答える
2

いいえ、顕著な違いはありません。最も読みやすいと思われるもの (a++通常は ) を使用します。

コード最適化の第 1 のルール: しないでください。

于 2012-02-15T11:25:21.253 に答える
1

コンパイラーは最適化する必要があり、まったく違いはありません。ただし、プレフィックスインクリメント演算子(コンパイラによって異なりますが)同等のポストフィックスよりも高速である可能性があることに注意してください(C ++およびC#でも)。

++a接尾辞演算子が一時変数を作成する必要があるためよりも高速a++です。それらの実装について考えてみてください。

プレフィックス:

a = a + 1;
return a;

後置:

int tmp = a;
a = a + 1;
return tmp;
于 2012-02-15T11:27:31.400 に答える
0

a++ははるかに高速です。アセンブラのINCコマンドに変換しますが、JVMはa = a + 1を最適化すると思いますので、気にする必要はありません。

于 2012-02-15T11:26:56.393 に答える
0

それは同じであり、最近のコンパイラ最適化では、パフォーマンスを向上させるために、そのようなことを認識してはいけません。allocsのような他のより大きな問題をチェックしてください:)

于 2012-02-15T11:27:07.447 に答える