Javaのforループでプリインクリメントとポストインクリメントを行う方がパフォーマンスが優れていますか?
サンプルコード:
for (int i=0; i<10; i++)
と
for (int i=0; i<10; ++i)
プレインクリメントを行うと、ポストインクリメントを行う場合よりも実行時間が短くなることに気付きました。なぜこれが当てはまるのかについての提案はありますか?ありがとう。
Javaのforループでプリインクリメントとポストインクリメントを行う方がパフォーマンスが優れていますか?
サンプルコード:
for (int i=0; i<10; i++)
と
for (int i=0; i<10; ++i)
プレインクリメントを行うと、ポストインクリメントを行う場合よりも実行時間が短くなることに気付きました。なぜこれが当てはまるのかについての提案はありますか?ありがとう。
最小限の例(Oracle jdk1.7.0_07)をコンパイルしました。
public void post() {
for (int i=0; i<10; i++) {
}
}
public void pre() {
for (int i=0; i<10; ++i) {
}
}
どちらの方法でも、まったく同じバイトコードが生成されました。
0 iconst_0
1 istore_1
2 goto 8 (+6)
5 iinc 1 by 1
8 iload_1
9 bipush 10
11 if_icmplt 5 (-6)
14 return
ループ本体がほとんど何もしないのでない限り、この質問は意味がありません。変数インクリメントのオーバーヘッドはゼロです。オーバーヘッドが際立っていたとしても、その大きさは完全に予測不可能であり、まったく同じハードウェア上のまったく同じ JVM の異なるインスタンス間でさえ、大幅に異なる可能性があります。「野生の」変動は、もちろん、0..2 ns の範囲内です。
それに基づくパフォーマンス上の問題はありません。パフォーマンスに関しては、どちらもまったく同じです。また、i++ の代わりに ++i を使用する必要があると主張する方法はありません。処理するロジック次第です。++i は最初にインクリメントしてから動作することを意味し、i++ は動作してからインクリメントすることを意味します。次の質問を見てください。
ポスト インクリメント (i++) およびプリ インクリメント (++i) 演算子は Java でどのように機能しますか?
言語に依存しない例:ループ内の i++ と ++i の違いは?
ポストインクリメントとプリインクリメント (またはデクリメント) は基本的に、++i などのプリインクリメントを使用している場合、そのコード行の残りの部分が評価される前に評価されることを意味します。i++ などの後置インクリメントを使用する場合、これは残りのコード行が評価された後に評価されます。それがおそらく「より速い実行時間」を得ている理由です。