[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


답변