본문 바로가기

오래된것

do~while인가, 중복 if문인가

 do~while인가, 중복 if문인가

 

  내가 자주쓰는 코딩 기법중 하나가, 중복 if문을 사용하지 않기 위해서(가독성을 위해서) do~while / break 형태의 코딩 기법을 많이 사용했었는데, 이것이 성능에 어떤 영향을 미치는지 궁금했다.

 

 

 do~while의 편리함

 

  내가 do~while을 사용하기 시작한것은 멀티 쓰래드 프로그래밍을 하면서 부터이다.

  간혹 lock을 잘못걸어 dead-lock이 종종 발생하게 되는데, 이에 대해 나는 대응책으로 do~while을 사용하기 시작했다.


  아래와 같은 코드가 있다고 보자.


[코드-1] 

 lock();

 if( g_box.find(box_id) ) {

    ...

    if( box.ba == false ) {

      unlock();

      return box.bb;

    }

 }

 unlock();


  위의 코드를 보게되면, return 전에 꼭 unlock()을 해줘야하는데, 나는 이게 귀찮았던 것이다. 외 unlock()코드를 두번 사용해서 이리 보기 힘든 코드를 작성해야 하는걸까? 라는 것이였다.


  그래서 생각해 낸것이 "break가 통하는 블럭을 사용하자"  였다. do~while문인 것이다.


위의 구문을 do~while문을 이용한 코드로 바꿔보자.


[코드-2]

 bool brtn = false;

 lock();

 do {

   if( g_box.find(box_id) ) {

     break;

   }

   ...

   if( box.ba == false ) {

     brtn = box.bb;

     break;

   }

 } while( false );

 unlock();

 return brtn;

 

  코드를 보니 좀 길어진것 같지만, 사실상 그렇지 않다. 더욱 이해하기 쉬우며, 직관적이다. 


  [코드-1]에선 어떻게 해서든 중복 if문을 사용하게 된다. 그리고 lock에 대한 부분도 신경을 써가며 코딩을 해야한다는 것은 정말 머리아픈일이였다.


  [코드-2]에선 하나의 if문에대해서 생각을 하면되고, lock에 대해섣 특별히 신경써야 할 것이 없다. 얼마나 편리한가?!

  그리고 return 에 대한 값에 대해서도 기본값(false)을 지정할수 있으며, 가독성 또한 좋다.(중복 if문이 거의 사라진다.)


  하지만... 이런 코드를 사용하다보니 큰 문제가 발생했다.


  [처리속도]


  바로 처리속도가 느려졌다.


  lock이 쓸대없는 부분까지 lock한다는 것이다. 위의 코드에선 들어나지 않았지만 do~while문 내부에는 lock이 필요없는 구문이 분명 존재하는 때가 있게 된다. 하지만 통일성을 지키자고 do~while을 계속 남발하다보니, 성능이 배로 줄어들더라.


  이것은 아직 해결되지 않은 과제이다.