c# 코드에서 부하가 큰 부분 찾아내기 – diagnostic tools

컴퓨터 프로그래밍을 하다 보면 어느 순간 자연스럽지 않게 cpu나 메모리의 점유가 올라간 걸 느끼게 될 때가 있다. 보통은 최근에 추가하거나 수정한 부분을 의심하여 이 부분을 주석으로 처리한 뒤 앞뒤 상황들을 비교하며 수습한다. 그러나 이렇게 단순한 방법으로는 해결이 되지 않는 경우들도 많다. 이럴 때 가장 원초적이고 확실한 방법은 문제가 생길 수 있는 모든 부분에 카운트를 달아서 반복 횟수를 확인하거나 메모리 크기를 확인할 수 있는 변수를 심어 놓고 그 증가된 정도를 검증하는 거다. 그러나 단순 무식한 방법들이 대개 그렇듯 효율이 떨어진다. 많은 코드들을 넣었다 빼야 하고 시간도 오래 걸린다. 이런 수고를 덜라고 비주얼 스투디오는 diagnostic tools를 제공한다.

비주얼 스투디오로 디버그를 시작하면 diagnostic tools 창이 오른쪽에 뜨고 차트가 그려진다. 나는 디버그할 때마다 이거 보이는 게 싫어서 없앴다. 하지만 cpu나 메모리의 부하를 측정하려면 이게 있어야 하니 나처럼 없앤 경우에는 메뉴에서 debug > windows > show diagnostic tools를 실행하여 창을 연다.

cpu 부하를 많이 유발하는 코드 찾기

cpu 부하는 동적 개념이므로 시간적 구간이 필요하다. 어느 한 순간의 상태만 봐서는 cpu 부하를 알 수 없다. 디버그를 시작하면 diagnostic tools 창의 아래에 탭들이 보일 거다. 그들 가운데에서 summary 탭이나 cpu usage 탭에 있는 record cpu profile을 클릭하면 부하 측정이 시작된다. 애플리케이션이 적당한 시간 작동하면 코드에 브레이크 포인트를 설정하여 멈추게 하거나 break all 버튼을 클릭하여 멈춘다. 그러면 끝난 거고 바로 분석으로 들어가면 된다.

애플리케이션이 멈춘 때 혹시 diagnostic tools 창이 사라진다면 다시 연다. 그러면 오른쪽에 파이 모양의 차트가 나오고 왼쪽에는 함수들이 나올 거다. 함수들을 이것저것 클릭하여 살펴보면 루틴별로 cpu를 이용한 퍼센트를 확인할 수 있다.

메모리 점유를 많이 한 코드 찾기

메모리 점유는 정적 개념이어서 한 순간을 포착하기만 하면 된다. cpu 점유를 확인할 때처럼 시간의 흐름은 필요하지 않다. 브레이크를 걸 필요조차 없다. 디버그가 되는 동안 summary 탭이나 memory usage 탭에 있는 take snapshot을 클릭한 뒤 view heap을 클릭하면 각 객체가 점유하고 있는 메모리의 비율이 나온다.