Visual Studio 2008 debug와 release의 차이

By | 2009/09/28

  이번에 인공지능 과제로 8-puzzle 문제를 푸는 프로그램 짜기가 나왔습니다. 주요 포인트로 heuristic function을 이용해서 problem space search를 얼마나 빠르게 할 수 있느냐를 직접 아는 것입니다.

  문제는 P1부터 P4로 숫자가 높아질수록 어럽습니다. 방법은 A1부터 A3로 각각 다음과 같습니다.

  • A1: A* search with he = 0
  • A2: A* search with he = # of tiles not in the place
  • A3: A* search with he = summation of manhattan distance to the place

  이렇게 문제를 이해한 다음에 C++로 코딩을 하고 돌려보았습니다.

  그런데 P1, P2는 제대로 나오는데 P3를 A1으로 푸는데 오랜 시간이 걸리는 것입니다. 너무 심하게 걸리는 듯싶어 일단 프로그램을 종료하고 최적화에 돌입하였습니다. 구조적 최적화에서 코딩 최적화까지 여러모로 수행하였습니다.

  하지만 결과는 대동소이하였습니다. 그래서 어떻게 할까 고민하다가 문득 이런 생각이 들었습니다.

Visual Studio에는 debug mode와 release mode가 있다고 한다. 지금 내가 debug mode이니 이를 release mode로 하면 속도 개선이 있지 않을까?

  그래서 debug에서 release로 바꿔서 컴파일과 링킹 후 실행해보았습니다. 그러자 앞에서 오래 걸리던 P3 A1이 기다릴만한 시간 내에 결과가 나왔습니다. P4 A1은 조금 오래 걸렸지만 그래도 결과가 나왔습니다.

  그렇게 결과를 얻어 과제를 해결한 후 문득 이런 궁금증이 들었습니다.

그럼 이 둘의 차이가 어느 정도일까?

  그래서 두 파일을 가지고 실험해보았습니다. 이를 제대로 알고자 문제를 풀 때 시간 측정을 하여 이를 파일로 출력하게 하였습니다. 그리고 돌려보았습니다.

  먼저 빨리 실행되었던 release는 어느 정도 시간 안에 문제를 풀었습니다. 그래서 그 결과를 저장한 후 debug를 실행시키고 잠을 청하였습니다. 제법 오래 걸릴 것을 예상하였기에 자고 일어나면 되어 있을 것이라는 예상을 하였습니다.

  하지만 예상은 빗나갔습니다. 자고 일어나니 P4 A1을 계속해서 풀고 있었습니다. 대략 6시간이 지났음에도 계속 풀고 있더군요.OTL..

  그래서 친구에게 부탁하였습니다. 재수 좋게도 친구 컴퓨터의 사양은 Intel Pentium Dual-Core Processor E5200에 RAM 2GB로 저보다 훨씬 좋은 것이었습니다. 따라서 그 결과를 기다릴 수 있는 시간 내에 얻을 수 있었습니다.

  결과는 다음과 같습니다. 단위는 ms입니다.

  P1 P2 P3 P4
A1 420.616 24163.5 507894 7454510
A2 7.33164 73.5473 2227.42 52239
A3 4.05648 20.2645 124.876 2976.56
  P1 P2 P3 P4
A1 4.22569 95.2119 1897.24 51744.8
A2 0.618111 2.48431 11.7964 223.113
A3 0.983959 2.06667 3.7202 18.0629

  위의 것이 debug 실행파일이고 밑의 것이 release 실행파일입니다. 보시는 것처럼 그 차이가 매우 크다는 것을 알 수 있습니다. 최소 약 10배에서 최대 약 270배 가량 빠릅니다. 문제가 되었던 P4 A1의 경우 debug는 2시간 가량이 걸렸지만, release는 51초 가량 걸린 것을 알 수 있습니다. 물론 이것은 다른 작업을 한다거나 하여 반드시 비례한다고 할 수 없지만, 그래도 확실히 빠르다는 것을 알 수 있습니다.

  그럼 왜 이런 차이가 나는 것일까? 찾아보니 이런 문구가 있습니다.

When an assembly is compiled in debug mode, additional symbolic information is embedded and the code is not optimised. This means that the output of the compiler is generally larger, slower and less efficient. However, a debugger can be attached to the running program to allow the code to be stepped through whilst monitoring the values of internal variables.

출처 : http://www.blackwasp.co.uk/DebugRelease.aspx

  아무래도 debug를 하려면 소스에 있는 변수나 함수명 등을 저장하여야 추적할 때 편할 것입니다. 따라서 이런 정보를 넣어두고 또한 그런 정보를 사용하지 않더라도 RAM에 계속 보관해야 할 것입니다. 그렇기에 느린 것이라 생각합니다.

  그래도 지금까지는 debug로도 잘 돌아가던 것들만을 하여서 별 생각 없이 살아왔습니다. 이번에 처음으로 release mode의 최적화를 경험하였습니다.^^;;; (이제서야?!) 앞으로는 이런 최적화에 많은 신경을 써야 하는 경지(?) 혹은 시기(?)가 온 듯싶습니다.^^

Leave a Reply