[java] 어떤 “if”구문이 더 빠릅니까? 문 또는 삼항 연산자?
두 가지 유형이 있습니다 if
: 고전 – 자바의 문장 if {} else {}
과 속기가 : exp ? value1 : value2
. 하나가 다른 것보다 빠르거나 같습니까?
성명서:
int x;
if (expression) {
x = 1;
} else {
x = 2;
}
삼항 연산자 :
int x = (expression) ? 1 : 2;
답변
거기에는 한 가지 유형의 “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가 다른 네이티브 코드로 끝났다면 매우 놀랍습니다.
답변
두 예제 모두 동일하거나 거의 동일한 바이트 코드로 컴파일되므로 성능에 차이가 없습니다.
실행 속도에 차이가 있었다면 여전히 가장 관용적 인 버전을 사용해야합니다 (단순 조건과 두 개의 간단한 하위 표현식을 기반으로 단일 변수를 할당하는 두 번째 버전, 더 복잡한 작업을 수행하는 첫 번째 버전). 또는 한 줄에 맞지 않는 작업).
답변
이것들은 동일합니다. 둘 다 상당히 빠르며 일반적으로 약 10-30 나노초입니다. (사용 패턴에 따라 다름)이 기간이 귀하에게 중요합니까?
가장 분명하다고 생각되는 일을해야합니다.
답변
다른 모든 답변에 추가하려면 :
두 번째 표현식은 종종 3 차 / 삼항 연산자 / 문이라고합니다. 표현식을 반환하므로 매우 유용 할 수 있습니다. 때로는 일반적인 짧은 문에 대해 코드를 더 명확하게 만듭니다.
답변
둘 다-그들은 동일하게 컴파일됩니다.
답변
삼항 연산자는 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