두 가지 유형이 있습니다 if
: 고전 - 자바의 문장 if {} else {}
과 속기가 : exp ? value1 : value2
. 하나가 다른 것보다 빠르거나 같습니까?
성명서:
int x;
if (expression) {
x = 1;
} else {
x = 2;
}
삼항 연산자 :
int x = (expression) ? 1 : 2;
두 가지 유형이 있습니다 if
: 고전 - 자바의 문장 if {} else {}
과 속기가 : exp ? value1 : value2
. 하나가 다른 것보다 빠르거나 같습니까?
성명서:
int x;
if (expression) {
x = 1;
} else {
x = 2;
}
삼항 연산자 :
int x = (expression) ? 1 : 2;
if
문에 사용하기위한 것입니다. ?
표현식에 사용됩니다.
답변:
거기에는 한 가지 유형의 "if"문만 있습니다. 다른 하나는 조건식입니다. 어느 쪽이 더 나은 성능을 낼지에 관해서는 동일한 바이트 코드로 컴파일 할 수 있으며, 동일하게 작동 할 것으로 기대합니다.
때로는 if
문이 더 읽기 쉽고 조건 연산자가 더 읽기 쉽습니다. 두 피연산자가 간단하고 부작용이없는 경우 두 가지의 주요 목적은 경우 반면 특히, 나는, 조건 연산자를 사용하는 것이 좋습니다 것 입니다 그들의 부작용, 내가 아마 사용하십시오 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가 다른 네이티브 코드로 끝났다면 매우 놀랍습니다.
main
하고 main2
있습니까?
다른 모든 답변에 추가하려면 :
두 번째 표현식은 종종 3 차 / 삼항 연산자 / 문이라고합니다. 표현식을 반환하므로 매우 유용 할 수 있습니다. 때로는 일반적인 짧은 문에 대해 코드를 더 명확하게 만듭니다.
final
필드 의 경우 생성자 블록을 사용하여 값을 설정할 수 있으며 (조건부 연산자가 IMO보다 10 억 배 더 좋아 보이지만) 로컬 변수를 사용하면 나중에 코드 블록에서 처음 사용하기 전에 값을 할당 할 수 있습니다. 삼항이 이점을 제공하는 유일한 경우 는 생성자를 if-else
호출 super(...)
하거나 this(...)
내부에서 호출 할 때 입니다.
삼항 연산자는 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