int a=a+1
usingとa++
inの間にパフォーマンスの違いはありますJava
か?
もしそうなら、どちらがより良いですか、そしてその理由は何ですか? これを理解するために簡単に説明していただけますか?
int a=a+1
usingとa++
inの間にパフォーマンスの違いはありますJava
か?
もしそうなら、どちらがより良いですか、そしてその理由は何ですか? これを理解するために簡単に説明していただけますか?
まず第一に、Java言語仕様はタイミングについて何も述べていません。しかし、Suns javacなどの一般的なコンパイラを使用していると仮定すると、上記のすべての例(、、、、a++
)は次のようにコンパイルできることがわかります。++a
a += 1
a = a + 1
iinc
命令、変数の操作:
iload_<variable>
iinc <variable>, 1
istore_<variable>
iadd
スタックを使用した命令(ここでは変数1
をストレージとして使用):
iload_1
iconst_1
iadd
istore_1
それらをコンパイルするための最良の方法を選択するのはコンパイラー次第です。たとえば、それらの間に違いはありません。そして、それはステートメント間の違いであってはなりません-それらはすべて同じことを表現しています-数字に1を足します。
そうは言っても、iinc
とiadd
バージョンの両方を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
}
生成されたバイトコードを見る:
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 の方が速い場合もあります)。パフォーマンスへの影響については心配しません。 .
いいえ、顕著な違いはありません。最も読みやすいと思われるもの (a++
通常は ) を使用します。
コード最適化の第 1 のルール: しないでください。
コンパイラーは最適化する必要があり、まったく違いはありません。ただし、プレフィックスインクリメント演算子は(コンパイラによって異なりますが)同等のポストフィックスよりも高速である可能性があることに注意してください(C ++およびC#でも)。
++a
接尾辞演算子が一時変数を作成する必要があるためよりも高速a++
です。それらの実装について考えてみてください。
プレフィックス:
a = a + 1;
return a;
後置:
int tmp = a;
a = a + 1;
return tmp;
a++ははるかに高速です。アセンブラのINCコマンドに変換しますが、JVMはa = a + 1を最適化すると思いますので、気にする必要はありません。
それは同じであり、最近のコンパイラ最適化では、パフォーマンスを向上させるために、そのようなことを認識してはいけません。allocsのような他のより大きな問題をチェックしてください:)