if
javaには、classic:if {} else {}
とshorthand:の2種類のステートメントがありますexp ? value1 : value2
。一方が他方よりも速いですか、それとも同じですか?
声明:
int x;
if (expression) {
x = 1;
} else {
x = 2;
}
三項演算子:
int x = (expression) ? 1 : 2;
if
javaには、classic:if {} else {}
とshorthand:の2種類のステートメントがありますexp ? value1 : value2
。一方が他方よりも速いですか、それとも同じですか?
声明:
int x;
if (expression) {
x = 1;
} else {
x = 2;
}
三項演算子:
int x = (expression) ? 1 : 2;
そこには「if」ステートメントのタイプが1つだけあります。もう1つは条件式です。どちらがより良いパフォーマンスになるかについて:それらは同じバイトコードにコンパイルでき、同じように動作することを期待します-または、パフォーマンスの観点からどちらかを選択したくないほど近いです。
ステートメントが読みやすくなる場合if
もあれば、条件演算子が読みやすくなる場合もあります。特に、2つのオペランドが単純で副作用がない場合は条件演算子を使用することをお勧めしますが、2つの分岐の主な目的がそれらの副作用である場合は、おそらくif
ステートメントを使用します。
サンプルプログラムとバイトコードは次のとおりです。
public class Test {
public static void main(String[] args) {
int x;
if (args.length > 0) {
x = 1;
} else {
x = 2;
}
}
public static void main2(String[] args) {
int x = (args.length > 0) ? 1 : 2;
}
}
で逆コンパイルされたバイトコードjavap -c Test
:
public class Test extends java.lang.Object {
public Test();
Code:
0: aload_0
1: invokespecial #1
4: return
public static void main(java.lang.String[]
Code:
0: aload_0
1: arraylength
2: ifle 10
5: iconst_1
6: istore_1
7: goto 12
10: iconst_2
11: istore_1
12: return
public static void main2(java.lang.String[
Code:
0: aload_0
1: arraylength
2: ifle 9
5: iconst_1
6: goto 10
9: iconst_2
10: istore_1
11: return
}
ご覧のとおり、ここではバイトコードにわずかなistore_1
違いがあります-ブランス内で発生するかどうか(以前の非常に欠陥のある試みとは異なります:)が、JITterが異なるネイティブコードで終わった場合は非常に驚きます。
どちらの例もおそらく同一またはほぼ同一のバイトコードにコンパイルされるため、パフォーマンスに違いはありません。
実行速度に違いがあった場合でも、最も慣用的なバージョンを使用する必要があります(これは、単純な条件と2つの単純な部分式に基づいて単一の変数を割り当てるための2番目のバージョンであり、より複雑な操作を行うための最初のバージョンです。または1行に収まらない操作)。
これらは同じです。どちらもかなり高速で、通常は約10〜30ナノ秒です。(使用パターンによって異なります)この時間枠はあなたにとって重要ですか?
あなたはあなたが最も明確であると信じていることをするべきです。
他のすべての答えに追加するだけです:
2番目の式は、多くの場合、三項/三項演算子/ステートメントと呼ばれます。式を返すので非常に便利です。通常の短いステートメントのコードがより明確になる場合があります。
どちらも-それらは同じようにコンパイルされます。
三項演算子は、if-else条件よりも高速です。
public class TerinaryTest {
public static void main(String[] args)
{
int j = 2,i = 0;
Date d1 = new Date();
for(long l=1;l<100000000;l++)
if(i==1) j=1;
else j=0;
Date d2 = new Date();
for(long l=1;l<100000000;l++)
j=i==1?1:0;
Date d3 = new Date();
System.out.println("Time for if-else: " + (d2.getTime()-d1.getTime()));
System.out.println("Time for ternary: " + (d3.getTime()-d2.getTime()));
}
}
試験結果:
トレイル-1:
if-elseの時間:63
三元時間:31
トレイル-2:
if-elseの時間:78
三元時間:47
トレイル-3:
if-elseの時間:94
三元時間:31
トレイル-4:
if-elseの時間:78
三元時間:47