program tip

Case vs If Else If : 어느 것이 더 효율적입니까?

radiobox 2020. 12. 12. 10:23
반응형

Case vs If Else If : 어느 것이 더 효율적입니까?


중복 가능성 :
"else if"가 "switch () case"보다 빠릅니까?
Java에서 if / else 대 스위치의 상대적 성능은 무엇입니까?

Ive는 다시 실행을 코딩했습니다 .... 디버거가 case 문을 실행하면 즉시 조건과 일치하는 항목으로 이동하지만 if / else를 사용하여 동일한 논리가 지정되면 모든 if 문을 실행합니다. 승자를 찾을 때까지. case 문이 더 효율적입니까, 아니면 디버거가 단계를 최적화하고 있습니까? (구문 / 오류에 대해 걱정하지 마십시오. 저는 이것을 이렇게 입력했습니다. 컴파일할지 모르겠습니다. 내가 추구하는 원리입니다. ints와 함께 오프셋을 사용하는 경우) C #을 사용하지만 프로그래밍 언어 전반에 걸친 일반적인 답변에 관심이 있습니다.

switch(myObject.GetType()){

    case typeof(Car):
        //do something
        break;

    case typeof(Bike):
        //do something
        break;

    case typeof(Unicycle):
        //do something
        break;

    case default:
        break;
}

VS

   Type myType = myObject.GetType();

   if (myType == typeof(Car)){
            //do something
   }

   else if (myType == typeof(Bike)){
            //do something
   }

   else if (myType == typeof(Unicycle)){
            //do something
   }
   else{

   }

컴파일러가 if 문보다 switch 문을 최적화하는 것이 더 나은 것 같습니다.

컴파일러는 if 문을 평가하는 순서가 중요한지 여부를 알지 못하며 거기에서 어떤 최적화도 수행 할 수 없습니다. if 문에서 메서드를 호출하여 변수에 영향을 줄 수 있습니다. switch-statement를 사용하면 모든 절을 동시에 평가할 수 있으며 가장 효율적인 순서로 배치 할 수 있습니다.

다음은 약간의 비교입니다.
http://www.blackwasp.co.uk/SpeedTestIfElseSwitch.aspx


디버거는 컴파일러가 생성하는 실제 코드를 단계별로 실행하고 싶지 않기 때문에 더 간단하게 만듭니다.

스위치에 5 개 이상의 항목이 포함 된 경우 조회 테이블 또는 해시 테이블을 사용하여 구현되고, 그렇지 않으면 if..else를 사용하여 구현됩니다.

밀접하게 관련된 질문 은 "switch () case"보다 "else if"가 빠릅니다. .

Other languages than C# will of course implement it more or less differently, but a switch is generally more efficient.


Many programming language optimize the switch statement so that it is much faster than a standard if-else if structure provided the cases are compiler constants. Many languages use a jump table or indexed branch table to optimize switch statements. Wikipedia has a good discussion of the switch statement. Also, here is a discussion of switch optimization in C.

One thing to note is that switch statements can be abused and, depending on the case, it may be preferable to use polymorphism instead of switch statements. See here for an example.


I believe because cases must be constant values, the switch statement does the equivelent of a goto, so based on the value of the variable it jumps to the right case, whereas in the if/then statement it must evaluate each expression.


it can do this for case statements as the values are compiler constants. An explanation in more detail is here http://sequence-points.blogspot.com/2007/10/why-is-switch-statement-faster-than-if.html


i think it's just the debugger making it simple. Note that a case and "if list" are not ultimately the same. There is is a reason why case blocks normally end with "break". The case stmt actually looks something like this when broken down in assembly.

if myObject.GetType() == type of Car
    GOTO START_CAR
else if myObject.GetType() == type of Bike
    GOTO START_BIKE

LABEL START_CAR
//do something car     
GOTO END

LABEL START_BIKE
//do something bike  
GOTO END

LABEL END

If you don't have the break, then the case blocks would be missing the "GOTO END" stmts, and in fact if you landed in the "car" case you'd actually run both sections

//do something car     
//do something bike  
GOTO END

Wikipedia's Switch statement entry is pretty big and actually pretty good. Interesting points:

  • Switches are not inherently fast. It depends on the language, compiler, and specific use.
  • A compiler may optimize switches using jump tables or indexed function pointers.
  • The statement was inspired by some interesting math from Stephen Kleene (and others).

For a strange and interesting optimization using a C switch see Duff's Device.

참고URL : https://stackoverflow.com/questions/2158759/case-vs-if-else-if-which-is-more-efficient

반응형