연습: 응용 프로그램 프로파일링
이 연습에서는 응용 프로그램을 프로파일링하여 성능 문제를 파악하는 방법을 보여 줍니다.
이 연습에서는 관리되는 응용 프로그램을 프로파일링하는 절차와, 샘플링 및 계측을 사용하여 응용 프로그램의 성능 문제를 격리하고 파악하는 절차를 단계별로 보여 줍니다.
이 연습에서는 다음 단계를 수행합니다.
샘플링 방법을 사용하여 응용 프로그램을 프로파일링합니다.
샘플링한 프로파일링 결과를 분석하여 성능 문제를 찾아 해결합니다.
계측 방법을 사용하여 응용 프로그램을 프로파일링합니다.
계측한 프로파일링 결과를 분석하여 성능 문제를 찾아 해결합니다.
사전 요구 사항
C#에 대한 약간의 이해
프로파일링으로 제공된 정보를 사용하여 작업할 때는 디버깅 기호 정보도 필요합니다.
샘플링 방법을 사용하여 프로파일링
샘플링은 문제의 프로세스가 주기적으로 폴링되어 활성 함수를 확인하는 프로파일링 방법입니다.결과 데이터에서는 프로세스가 샘플링될 때 문제의 함수가 호출 스택 맨 위에 오는 간격을 알 수 있습니다.
샘플링 방법을 사용하여 응용 프로그램을 프로파일링하려면
관리자 권한으로 Visual Studio를 엽니다.프로파일링을 수행하려면 관리자 권한으로 실행해야 합니다.
PeopleTrax 솔루션을 엽니다.
솔루션 탐색기에 PeopleTrax 솔루션이 열립니다.
프로젝트 구성 설정을 릴리스로 설정합니다.
응용 프로그램의 성능 문제를 찾으려면 릴리스 빌드를 사용해야 합니다.디버그 빌드의 경우 성능에 나쁜 영향을 줄 수 있는 추가 정보가 컴파일되어 있고 성능 문제가 정확히 표시되지 않을 수 있으므로 프로파일링에는 릴리스 빌드를 사용하는 것이 좋습니다.
분석 메뉴에서 성능 마법사 시작을 클릭합니다.
성능 마법사가 나타납니다.
**CPU 샘플링(권장)**이 선택되어 있는지 확인하고 다음을 클릭합니다.
**다음 응용 프로그램 중 프로파일링할 대상을 선택하십시오.**에서 PeopleTrax를 선택하고 다음을 클릭합니다.
Visual Studio에서 프로젝트가 빌드되고 응용 프로그램 프로파일링이 시작됩니다.PeopleTrax 응용 프로그램 창이 나타납니다.
Get People을 클릭합니다.
데이터내보내기를 클릭합니다.
메모장이 열리고, PeopleTrax에서 내보낸 데이터가 포함된 새 파일이 메모장에 표시됩니다.
메모장을 닫고 PeopleTrax 응용 프로그램을 닫습니다.
프로파일러에서 프로파일링 데이터 파일(*.vsp)이 생성되고, 성능 탐색기 창의 보고서 영역에 해당 파일 이름이 표시되며, Visual Studio의 주 창에 이 데이터 파일의 요약 뷰가 자동으로 로드됩니다.
샘플링한 프로파일링 결과를 분석하려면
요약 뷰에는 프로파일링 실행 중의 CPU 사용률을 보여 주는 시간 표시 막대, 응용 프로그램의 호출 트리에서 가장 많이 실행된 분기를 나타내는 실행 부하 과다 경로 목록, 그리고 함수 본문의 코드를 실행하는 동안 가장 많이 샘플링된 함수를 보여 주는 개별 작업이 가장 많은 함수 목록이 표시됩니다.
실행 부하 과다 경로 목록을 보면 목록의 끝에 가장 가까이 있는 PeopleTrax 함수는 PeopleNS.People.GetNames 메서드임을 알 수 있습니다.이 위치는 분석하기에 좋은 위치입니다.이 함수 이름을 클릭하면 GetNames에 대한 세부 정보가 함수 정보 뷰에 표시됩니다.
함수 정보 뷰에는 두 개의 창이 포함되어 있습니다.비용 분산 창에는 해당 함수에 의해 수행된 작업, 해당 함수가 호출한 함수에 의해 수행된 작업, 그리고 샘플링된 인스턴스 수 중 해당 함수를 호출한 함수가 차지하는 비중을 보여 주는 그래픽 뷰가 표시됩니다.함수 이름을 클릭하면 이 뷰의 중심이 되는 함수를 변경할 수 있습니다.예를 들어 PeopleNS.People.GetPeople을 클릭하면 GetPeople이 선택한 함수가 됩니다.
함수 코드 뷰 창에는 함수의 소스 코드(사용 가능한 경우)가 표시되고, 선택한 함수에서 가장 부담이 큰 줄이 강조 표시됩니다.GetNames를 선택하면 이 함수가 응용 프로그램 리소스에서 문자열을 읽어 온 다음 StringReader를 사용하여 이 문자열의 각 줄을 ArrayList에 추가한다는 것을 알 수 있습니다.이 함수를 최적화할 수 있는 명확한 방법은 없습니다.
PeopleNS.People.GetPeople이 GetNames의 유일한 호출자이므로 코드 분산 창에서 GetPeople을 클릭하여 해당 코드를 검사합니다.이 메서드는 GetNames에서 생성된 인물 및 회사 이름으로 구성된 PersonInformationNS.PersonInformation 개체의 ArrayList를 반환합니다.그러나 GetNames는 PersonInformation 개체가 만들어질 때마다 두 번씩 호출됩니다.따라서 이 메서드가 시작될 때 목록을 한 번만 만든 다음 PersonInformation 생성 루프 중에 이 목록을 인덱싱하면 이 메서드를 쉽게 최적화할 수 있습니다.
샘플 응용 프로그램에는 다른 버전의 GetPeople도 제공되며, 빌드 속성에 조건부 컴파일 기호를 추가하면 이 최적화된 함수를 호출할 수 있습니다.솔루션 탐색기 창에서 People 프로젝트를 마우스 오른쪽 단추로 클릭하고 속성을 클릭합니다.속성 페이지 메뉴에서 빌드를 클릭한 다음 조건부 컴파일 기호 입력란에 OPTIMIZED_GETPEOPLE을 입력합니다.그러면 다음 빌드에서는 최적화된 버전의 GetPeople이 원래 메서드 대신 사용됩니다.
성능 세션을 다시 실행합니다.성능 탐색기 도구 모음에서 프로파일링 시작을 클릭합니다.Get People을 클릭하고 데이터 내보내기를 클릭합니다.나타나는 메모장 창을 닫은 다음 PeopleTrax 응용 프로그램을 닫습니다.
새 프로파일링 데이터 파일이 생성되고 Visual Studio 주 창에 새 데이터에 대한 요약 뷰가 나타납니다.
두 프로파일링 실행 결과를 비교하려면 성능 탐색기에서 두 개의 데이터 파일을 선택하고 이 파일을 마우스 오른쪽 단추로 클릭한 다음 성능 보고서 비교를 클릭합니다.Visual Studio 주 창에 비교 보고서 창이 나타납니다.델타 열에는 이전 기본 값에서 이후 비교 값으로의 함수 성능 값 변화가 표시됩니다.열 드롭다운 목록에서 비교할 값을 선택할 수 있습니다.**포괄 샘플 비율(%)**을 선택합니다.
GetPeople 및 GetNames 메서드에서 성능이 상당히 향상되었음을 알 수 있습니다.
계측 방법을 사용하여 프로파일링
계측은 프로파일러에서 특별히 빌드된 버전의 프로파일링된 이진 파일에 프로브 함수를 삽입하는 프로파일링 방법입니다.프로브는 계측되는 모듈에서 함수가 시작 및 종료될 때 및 해당 함수의 모든 호출 사이트에서 타이밍 정보를 수집합니다.계측 프로세스는 디스크에 쓰거나 네트워크를 통해 통신하는 등의 입력/출력 작업과 관련된 문제를 검사하는 데 유용합니다.계측 방법을 사용하면 샘플링 방법에 비해 자세한 정보를 얻을 수 있지만 프로세스 실행에는 방해가 되어 더 많은 오버헤드가 발생합니다.또한 계측된 이진 파일은 디버그 또는 릴리스 이진 파일보다 크며 개발용이 아닙니다.
이 연습 단원에서는 계측 방법을 사용하여 이전에 프로파일링한 PeopleTrax 응용 프로그램에서 최적화가 가능한 더 많은 코드를 찾습니다.요약 뷰 시간 표시 막대의 필터를 사용하면 프로파일링된 응용 프로그램에서 메모장 파일에 인물 목록을 쓰는 데이터 내보내기 시나리오를 보다 중점적으로 살펴볼 수 있습니다.
계측 방법을 사용하여 기존 응용 프로그램을 프로파일링하려면
필요한 경우 Visual Studio에서 PeopleTrax 응용 프로그램을 엽니다.
현재 관리자 권한으로 실행 중이며 솔루션의 빌드 구성이 릴리스로 설정되어 있어야 합니다.
성능 탐색기에서 계측을 클릭합니다.
성능 탐색기 도구 모음에서 프로파일링 시작을 클릭합니다.
프로파일러에서 프로젝트가 빌드되고 응용 프로그램 프로파일링이 시작됩니다.PeopleTrax 응용 프로그램 창이 나타납니다.
Get People을 클릭합니다.
PeopleTrax 데이터 표에 데이터가 채워집니다.
약 10초 동안 기다렸다가 데이터 내보내기를 클릭합니다.
메모장이 열리고 PeopleTrax의 인물 목록이 포함된 새 파일이 메모장에 표시됩니다.잠깐 기다리면 필터링을 위한 데이터 내보내기 절차를 보다 쉽게 식별할 수 있습니다.
메모장을 닫고 PeopleTrax 응용 프로그램을 닫습니다.
Visual Studio에서 성능 세션 보고서(*.vsp)를 생성합니다.
계측된 프로파일링 결과를 분석하려면
보고서의 요약 뷰에 있는 시간 표시 그래프에서는 프로파일링 실행 기간 중 프로그램의 CPU 사용률을 보여 줍니다.데이터 내보내기 작업은 그래프의 오른쪽에서 일정 기간 동안 사용률이 높은 부분으로 표시됩니다.성능 세션을 필터링하면 내보내기 작업 중에 수집된 데이터만 표시하고 분석할 수 있습니다.그래프에서 데이터 내보내기 작업이 시작되는 지점의 왼쪽을 클릭합니다.다시 이 작업의 오른쪽을 클릭합니다.그런 다음 시간 표시 막대의 오른쪽에 있는 링크 목록에서 선택 항목으로 필터링을 클릭합니다.
실행 부하 과다 경로 트리에서는 PeopleTrax.Form1.ExportData 메서드가 호출하는 Concat 메서드에서 상당한 비율의 시간이 소요됨을 보여 줍니다.System.String.Concat는 개별 작업이 가장 많은 함수 목록의 맨 위에도 나타나므로 이 함수에 소요되는 시간을 줄이면 코드를 최적화할 수 있습니다.
두 요약 표 중 하나에서 System.String.Concat를 두 번 클릭하여 함수 정보 뷰에 자세한 정보를 표시합니다.
Concat를 호출하는 메서드는 PeopleTrax.Form1.ExportData뿐임을 알 수 있습니다.호출 함수 표시 목록에서 PeopleTrax.Form1.ExportData를 클릭하여 이 메서드를 함수 정보 뷰의 대상으로 선택합니다.
함수 코드 뷰 창에서 이 메서드를 검사합니다.System.String.Concat에 대한 리터럴 호출은 없습니다.대신 컴파일러에서 System.String.Concat에 대한 호출로 대체되는 += 피연산자가 몇 번 사용됩니다..NET Framework에서 문자열을 수정하면 새 문자열이 할당됩니다..NET Framework에는 문자열 연결에 맞게 최적화된 StringBuilder 클래스가 포함되어 있습니다.
이 문제 영역을 최적화된 코드로 대체하려면 OPTIMIZED_EXPORTDATA를 조건부 컴파일 기호로 PeopleTrax 프로젝트에 추가합니다.
솔루션 탐색기에서 PeopleTrax 프로젝트를 마우스 오른쪽 단추로 클릭하고 속성을 클릭합니다.
PeopleTrax 프로젝트 속성 폼이 나타납니다.
빌드 탭을 클릭합니다.
조건부 컴파일 기호 입력란에 OPTIMIZED_EXPORTDATA를 입력합니다.
프로젝트 속성 폼을 닫고, 메시지가 나타나면 모두 저장을 선택합니다.
응용 프로그램을 다시 실행하면 성능이 현저히 향상되었음을 알 수 있습니다.성능이 눈에 띄게 향상되더라도 프로파일링 세션을 다시 실행하는 것이 좋습니다.첫 번째 문제 때문에 확인하기 힘들었던 다른 문제가 더 있을 수 있으므로 문제를 해결한 후 데이터를 다시 검토해야 합니다.