C언어에서의 if eles문과 switch문의 리소스 차이는?
어떤 기능을 10가지로 구분을 해야한다면, if ,ifelse, else를 나열하는 것과 switch case 문을 사용할경우 MCU 내부적인 동작에 있어서 어떠한 구문이 더 효과적일까요?
if else 나 switch case 를 사용하나 어차피 C 언어는 어셈블리어로 컴파일됩니다.
어셈블리어로 변환하게 되면 위 구문은 어차피 같은 결과가 나올 것 같네요.
if else 를 사용하느냐 switch case 를 사용하느냐는 가독성의 차이로 생각하시면 될 것 같습니다.
다만 if else 가 비효율적으로 작성된다면 switch case 보다 효율이 떨어질 수 있겠죠.
비교횟수가 많아질수록 효율이 떨어질 것입니다.
비슷한 내용이 아래 커뮤니티에서도 많은 이야기가 있는 것 같습니다.
너무 극단적인 상황이 아니라면 어느정도는 컴파일러의 판단을 따르는 것이 좋지 않을까 합니다.
개인적으로는 가독성이 좋은 방향으로 하고 컴파일러가 최적화를 하는 방향을 선호하기는 합니다.
통상적으로 if elseif의 개수가 적은 경우는 switch와 성능이 비슷하나, if elseif 의 개수가 늘어나면 늘어날수록 if elseif에 비해 switch가 성능이 좋아진다고 알려져 있습니다만, switch문내에서의 구문의 차이에 따라서 조금씩 달라질수는 있겠습니다..
이것은 일반적으로 답이 없는 이야기입니다. 왜냐하면 C언어의 규격(specification)에서는 이런 동작을 구현해야하는 것을 정하고 있지만 어떻게 기계어로 동작하게 할지에 대해서는 컴파일러를 구현자에게 전적으로 맡기기 때문입니다.
예를 들자면 ANSI C에서는 switch 의 case 레이블은 최소한 257개를 허용해야 한다고 되어 있습니다.
하지만 Visual Studio의 C 컴파일러는 case에 대한 레이블에 대해 제한을 하고 있지 않습니다. (출처: MSDN)따라서 어떤 것이 MCU에서 효과적인지는 컴파일되는 기계어 코드를 보고 판단을 하시는 것이 좋겠습니다.
안녕하세요. A-HA 프로그래밍 전문가 입니다.
if ,ifelse, else를 나열하는 것과 switch case 문을 사용할경우 내부 동작이나 리소스 차이는 거의 없다고 보시면 됩니다.
다만 가독성을 위해서 메인 함수에서 분기처리늘 할 때는 switch case 문을 사용하기도 하지만 if else로 대부분 처리하는 편이죠.
안녕하세요. 아하(a-ha) 프로그래밍 지식 답변자 입니다.
이전에도 if else 와 switch의 차이점을 물어봤던 질문이 있었었는데요, 당시엔 다른 질문자님이 어떤 언어인지 명시를 안 해주셔서 정확한 답변은 못 해드렸었습니다.
if else 문의 경우 branch statement로 입력된 데이터를 위에서부터 아래로 순차적으로 비교를 하기 때문에 시간복잡도 n을 갖습니다.
반면 switch case의 경우 jump statement로 입력된 값을 보고 해당 조건으로 바로 점프를 하기 때문에, 리소스가 제한적이고 if else 문이 많이 등장할 경우, switch case로 변형하여 성능 향상을 할 수 있습니다.
답변이 도움이 됐으면 좋겠습니다. 좋은 하루 되세요!
안녕하세요.
if문과 switch문의 성능 차이에 대한 질문을 주셨네요.
MCU 쪽 성능은 잘 모르지만, 마이크로 유닛이니 클럭 속도가 빠르지는 않을 것 같습니다.
(일반적으로 x86의 경우 6클럭 이하인 것으로 알고 있습니다.)
만약 조건절이 적다면 if나 switch가 큰 차이는 없겠지만
10개의 조건절을 쓰려고 하신다니 저는 switch 문을 사용하는 것이 효과적이라고 봅니다.
일반적으로 컴파일러 최적화 시에 switch문이 좀 더 유리한 편인데
구현체들이 대개 switch문을 jump table로 구현하는 이유도 있습니다.
도움이 되셨기를 바랍니다.
감사합니다.