• Tistory
    • 태그
    • 위치로그
    • 방명록
    • 관리자
    • 글쓰기
Carousel 01
Carousel 02
Previous Next

성능 및 메모리 관점에서 살펴본 if문과 switch 문의 차이점

Programming/C, C++, MFC 2015. 4. 21. 13:56





if 와 switch 비슷하지만 다른녀석 


이 아이들의 특징을 잘 정리해 주신 분이 있어 메모.


==========================================================================================


if~else 문과 switch~case 문의 차이점에 관해서 알아보자...

코드는 다음과 같이 작성 해 보았다.






이 예제를 보면 분석하기 쉬울 것이다.

if문 예제에 대한 assembly 코드는 다음과 같다.





위 assembly 코드를 보면 1,2,3,4를 보면 각 조건문마다 cmp 명령문을 사용한 것을 볼 수 있다.

따라서, 최악의 경우에 조건문의 개수만큼 cmp를 하게 된다.O(n)의 시간복잡도를 갖는다고 말할 수 있겠다.



switch 문에 대한 assembly코드이다.


이 코드에 관해 약간의 설명을 하겠다.


1 : ecx 레지스터으 ㅣ값을 1 감소한다. 이는 switch 문에서 대상이 되는 값을 1 감소하는 것이다.

이때, 항상 1을 감소하는 것이 아니라 case 문 중에서 가장 작은 값을 ecx레지스터에서 뺴는 것이다.

이렇게 하면 switch문에서 ecx레지스터으 ㅣ값은 (case문의 개수 - 1)이 된다.

이게 바로 switch문에서 쓰이는 jump table의 크기가 되는 것이다.

-1을 하는 이유는 배열의 시작 번지가 0이기 때문이다. 

3번에서 jmp명령어를 보면 배열을 이용하여 jump table에 접근하는 것을 볼 수 있다.


2 : switch 문에 있는 변수값 (a)가 3보다 큰지를 검사하고 있다.

만일에 크다면 jump할 case문이 없으므로 default 문으로 이동하도록 하는 코드이다.

이때 3과 비교하는 것은 case문에서 (가장 큰 값 -1) 이 3이기 때문이다.

만이레 3보다 크다면 jump 할 case문이 없기 때문이다.


3 : jump 할 case 문이 있을 경우 이 코드에 진입을 한다.

이 코드에 진입 한 후 jump table을 뒤져보는 것이다. 

jump table에 mapping 되는 값으로 jump 하도록 되어있다.


4 : 이곳이 바로 jump table 이다. 

이 jump table의 크기는 (case문의 가장큰값 - case문의 가장작은값 + 1)이다.

이 jump table의 각 원소의 값은 jump 할 label 이다.


그렇다면 정말로 jump table의 크기가 (case문의 가장큰값 - case문의 가장작은값 + 1)일까 ??


그렇다면 case 1, case 2, case 3, case 10이라면 jump table의 크기가 어떻게 될까 ???


최적화의 관점에서 보자면, 테이블의 크기가 4ㅇ리면 좋겠지만, 애석하게도 성능의 향상을 위해서 테이블의 크기를 10으로 했다.


다음 C 코드를 보자



If 문의 assembly 코드는 다음과 같다. 특별한 점은 없다. 앞에서 설명한 것과 동일하다.





하지만, switch 문에서 jump table을 보면 다음과 같다.



$541에는 jump table의 index 번호가 저장되어 있고, 실제로 jump table은 $542에 저장되어 있음을 알 수 있다.


만약에 case 1, case 2, case 3, case 100000 이라면 메모리는 상당히 많이 차지 할 것이다.


성능을 향상 시키느냐 메모리를 향상 시키느냐는 결국 선택해야 할 문제이다.


만약에 if~else문이 매우 많이 있고, 그 함수를 매우 많이 호출하는데, 성능이 중요하다면 


switch case 문으로 성능 향상을 할 수 있을 것이다.


또한, switch case 문에서 case의 값은 가급적이면 순차적으로 감소 또는 증가하는 것이 메모리 관리면에서 좋을 것이다.


마지막으로 case문의 개수에 따라 switch 문은 jump tableㅇ르 사용 할 것인지 사용하지 않을 것인지를 결정한다.


이 case 문의 개수가 4이상이냐 아니냐는 것이다.


만약에 case 문의 개수가 4 이상이면 jump table을 사용하고, 그렇지 않다면 사용하지 않는다. 


출처 : http://blog.naver.com/PostView.nhn?blogId=kki2406&logNo=80041410085




저작자표시 비영리 (새창열림)

'Programming > C, C++, MFC' 카테고리의 다른 글

HTTP 프로토콜을 이용하여 웹상의 파일을 다운로드 하자.  (0) 2016.03.09
[Function] 폴더 내 파일 탐색  (0) 2015.12.09
[VS2013] error MSB8031 - 멀티바이트문자집합 에러를 해결하자.  (0) 2015.03.06
Dialog에 Drag&Drop 기능을 적용하자.  (0) 2014.12.01
rand() 는 랜덤이 아니다?? 이제는 랜덤을 바꿔야 할 때!  (0) 2014.11.21
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

카테고리

  • 살다보니.. (448)
    • 주절거림 (3)
    • 취미생활 (36)
      • 지식과 지혜 (3)
      • 풍경이 되어 (4)
      • Memories (17)
      • 엥겔지수를 높여라 (2)
    • mathematics (6)
      • Matrix Computation (2)
      • RandomProcesses (3)
    • English.. (8)
    • Programming (147)
      • C, C++, MFC (51)
      • C# (1)
      • OpenCV (17)
      • Python (58)
      • Git, Docker (3)
      • Matlab (4)
      • Windows (3)
      • Kinect V2 (2)
      • 기타 etc. (8)
    • 전공관련 (80)
      • Algorithm (6)
      • Deep Learning (54)
      • 실습 프로그램 (4)
      • 주워들은 용어정리 (8)
      • 기타 etc. (8)
    • Computer (118)
      • Utility (21)
      • Windows (31)
      • Mac (4)
      • Ubuntu, Linux (58)
      • NAS (2)
      • Embedded, Mobile (2)
    • IT, Device (41)
      • 제품 사용기, 개봉기 (14)
      • 스마트 체험단 신청 (27)
    • Wish List (3)
    • TISTORY TIP (5)
    • 미분류. 수정중 (1)

태그목록

  • matlab function
  • CStdioFile
  • review
  • 칼로리 대폭발
  • 후쿠오카
  • 스마트체험단
  • 큐슈
  • matlab
  • DeepLearning
  • SVM
  • 매트랩 함수
  • ReadString
  • Deep Learning
  • LIBSVM
  • 포르투갈
  • 매트랩
  • random variable
  • Convolutional Neural Networks
  • Computer Tip
  • function
  • portugal
  • 오봉자싸롱
  • 일본
  • DSLR
  • 갤럭시노트3
  • utility
  • 에누리닷컴
  • 크롬
  • 딥러닝
  • ColorMeRad

달력

«   2025/05   »
일 월 화 수 목 금 토
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
05-15 02:30

LATEST FROM OUR BLOG

RSS 구독하기

BLOG VISITORS

  • Total :
  • Today :
  • Yesterday :

Copyright © 2015 Socialdev. All Rights Reserved.

티스토리툴바