성능 프로파일러란 visual studio에서 제공하는 기능으로 CPU, 메모리 사용량 등을 분석할 수 있는 도구이다.
여러 성능 분석 방법 중 '계측' 방법을 사용한 후기를 공유하고자 한다.
문제 상황
우리가 개발중인 프로그램과 타사 프로그램의 성능을 비교해보았다.
결과는 타사 프로그램의 승리였다.
우리가 개발한 프로그램의 성능이 더 느린 원인은 뭘까?
그 궁금증을 해결하기 위해 성능 테스트를 시작했다.
방법 1 - 코드 라인 실행 시간 측정
C#에서 코드 라인 실행 시간을 측정하기 위한 방법으로 Stopwatch가 있다.
Stopwatch는 다음과 같이 사용한다.
Stopwatch sw = new(); //Stopwatch 객체 생성
sw.Start(); //Stopwatch 시작
//측정하고 싶은 코드 작성
sw.Stop(); //Stopwatch 종료
Console.WriteLine($"코드 실행 시간 : {sw.ElapsedMilliseconds}ms");
이렇게 하면 Stopwatch를 시작한 시점부터 종료 시점까지의 시간을 구할 수 있다.
이 방법으로 병목현상이 의심되는 코드에 Stopwatch 코드를 작성하는 것을 반복하면 문제가 되는 코드를 찾아낼 수 있다.
아래는 문제 코드를 찾아가는 과정을 작성한 것이다.
구간1 - 0ms
구간2 - 14ms
구간3 - 90ms
구간4 - 3ms
위에서 문제가 되는 구간은 3번이다.
3번 구간에 대해서 범위를 좁혀서 다시 측정한다.
구간3.1 - 1ms
구간3.2 - 87ms
구간3.3 - 1ms
구간3.4 - 1ms
구간3.2에 대해서 범위를 좁혀서 다시 측정한다.
..
..
..
이 과정을 반복하여 최종적으로 System.Net.WebRequest.GetResponse라는 Method에서 시간을 많이 사용하는 것을 알 수 있었다.
이 방법은 문제가 되는 코드를 찾는 확실한 방법이지만 범위를 계속해서 좁혀가면서 반복적으로 측정해야하는 부담이 있다.
방법2 - 성능 프로파일러 사용 (계측)
더 좋은 방법이 없을까 찾다가 발견한 것이 visual studio에 내장되어 있는 성능 프로파일러이다.
방법1에서 했던 작업을 자동으로 해주는 것이 성능 프로파일러의 기능이다.
성능 프로파일러 기능 중 하나인 계측은 성능 분석을 위해서 빌드된 바이너리를 수정한다.
수정된 바이너리에서는 성능 분석을 위한 특수 코드를 분석 대상 함수의 시작과 끝에 모두 추가한다.
그 결과 모든 함수에 대한 성능 정보를 수집할 수 있게 된다.
또한 CPU 샘플링에서 확인할 수 없었던 시스템 수준의 자세한 정보까지 확인할 수 있다.
이번에는 성능 프로파일러를 사용하여 성능 저하 원인을 찾아보자.
메뉴 - 디버그 - 성능프로파일러를 클릭한다.
분석 대상에서 '계측'을 체크하고 시작버튼을 클릭한다.
프로젝트를 선택하고 확인버튼을 클릭한다.
위와 같이 표시되면서 프로파일링이 시작된다.
실행된 프로그램에서 문제 상황을 재현한 다음 프로그램을 종료한다.
프로그램을 종료하고 조금 기다리면 위와 같은 보고서가 나온다.
CPU 사용률, 실행 부하 과다 경로, 개별 작업이 가장 많은 함수 등이 정리되어 표시된다.
개별 작업이 가장 많은 함수 쪽을 보면 방법1에서 찾아냈던 문제의 코드인 System.Net.WebRequest.GetResponse 메소드를 확인할 수 있다.
성능 프로파일러 기능을 통해 클릭 몇 번으로 성능 이슈를 금방 찾아 낼 수 있었다.
해당 함수를 클릭하면 호출 스택을 자세하게 볼 수도 있다.
마치며
이번 경험으로 성능 프로파일러의 강력함을 느낀 것 같다.
다음 테스트부터는 적극적으로 활용하여 업무 효율을 높여봐야겠다.
참고자료
'Tech. Post > CodeHub, 잡다한 코드 이야기' 카테고리의 다른 글
[C#] Lambda, Func, Action (2) | 2022.11.28 |
---|---|
[C#] LINQ - Where 사용법 (3) | 2022.10.18 |