연습: 성능 문제 확인Walkthrough: Identifying Performance Problems

이 연습에서는 성능 문제를 파악하도록 응용 프로그램을 프로파일링하는 방법을 설명합니다.This walkthrough demonstrates how to profile an application to identify performance problems.

이 연습에서는 관리되는 응용 프로그램을 프로파일링하고 샘플링 및 계측을 사용하여 응용 프로그램의 성능 문제를 격리 및 식별하는 과정을 단계별로 진행합니다.In this walkthrough, you will step through the process of profiling a managed application and using sampling and instrumentation to isolate and identify performance problems in the application.

이 연습에서는 다음과 같은 단계를 수행합니다.In this walkthrough, you will follow these steps:

  • 샘플링 방법을 사용하여 응용 프로그램 프로파일링Profile an application by using the sampling method.

  • 성능 문제를 찾아서 해결하기 위해 샘플링된 프로파일링 결과 분석Analyze sampled profiling results to locate and fix a performance issue.

  • 계측 방법을 사용하여 응용 프로그램 프로파일링Profile an application by using the instrumentation method.

  • 성능 문제를 찾아서 해결하기 위해 계측된 프로파일링 결과 분석Analyze instrumented profiling results to locate and fix a performance issue.

필수 구성 요소Prerequisites

  • C#에 대한 중간 정도의 이해도Intermediate understanding of C#.

  • PeopleTrax 샘플의 복사본A copy of the PeopleTrax Sample.

    프로파일링을 통해 제공되는 정보를 사용하려면 디버깅 기호 정보를 준비해 두는 것이 가장 좋습니다.To work with the information provided by profiling, it is best to have debugging symbol information available.

샘플링 방법을 사용하여 프로 파일링Profiling by Using the Sampling Method

샘플링은 해당하는 프로세스를 주기적으로 폴링하여 활성 함수를 확인하는 프로파일링 방법입니다.Sampling is a profiling method by which the process in question is periodically polled to determine the active function. 결과 데이터는 프로세스를 샘플링할 때 확인하려는 함수가 호출 스택 위에 있었던 빈도에 해당하는 수를 제공합니다.The resulting data provides a count of how frequently the function in question was on top of the call stack when the process was sampled.

샘플링 방법을 사용하여 응용 프로그램을 프로파일링하려면To profile an application by using the sampling method

  1. 관리자 권한으로 Visual StudioVisual Studio을 엽니다.Open Visual StudioVisual Studio with Administrator privileges. 프로파일링 시에는 관리자 권한으로 Visual Studio를 실행해야 합니다.Running as an administrator is required for profiling.

  2. PeopleTrax 솔루션을 엽니다.Open the PeopleTrax solution.

    이제 PeopleTrax 솔루션이 솔루션 탐색기에 표시됩니다.The PeopleTrax solution now populates Solution Explorer.

  3. 프로젝트 구성 설정을 릴리스로 설정합니다.Set the project configuration setting to Release.

    응용 프로그램에서 성능 문제를 검색하려면 릴리스 빌드를 사용해야 합니다.You should use a release build to detect performance problems in your application. 디버그 빌드에는 성능을 저하시킬 수 있으며 성능 문제를 정확하게 보여 주지 않는 추가 정보가 컴파일되어 있으므로 프로파일링에는 릴리스 빌드를 사용하는 것이 좋습니다.A release build is recommended for profiling because a debug build has additional information compiled into it that might adversely affect performance and do not illustrate performance issues accurately.

  4. 분석 메뉴에서 성능 프로파일러를 선택하고 성능 마법사를 선택한 다음 시작을 선택합니다.On the Analyze menu, select Performance Profiler, then select Performance Wizard, and then select Start.

    성능 마법사가 나타납니다.The Performance Wizard appears.

  5. CPU 샘플링(권장)이 선택되어 있는지 확인하고 다음을 클릭합니다.Make sure CPU Sampling (recommended) is selected and then click Next.

  6. 다음 응용 프로그램 중 프로파일링할 대상을 선택하십시오.에서 PeopleTrax를 선택하고 다음을 클릭합니다.In Which application would you like to target for profiling, select PeopleTrax, and then click Next.

    Visual StudioVisual Studio에서 프로젝트를 빌드하고 응용 프로그램 프로파일링을 시작합니다. builds the project and starts to profile the application. PeopleTrax 응용 프로그램 창이 나타납니다.The PeopleTrax application window appears.

  7. 사용자 가져오기를 클릭합니다.Click Get People.

  8. ExportData를 클릭합니다.Click ExportData.

    메모장이 열리고 PeopleTrax에서 내보낸 데이터가 들어 있는 새 파일이 표시됩니다.Notepad opens and displays a new file that contains the exported data from PeopleTrax.

  9. 메모장을 닫은 다음 PeopleTrax 응용 프로그램을 닫습니다.Close Notepad, and then close PeopleTrax application.

    프로파일러는 프로파일링 데이터(*.vsp) 파일을 생성하고, 성능 탐색기 창의 보고서 섹션에 파일 이름을 나열하고, Visual StudioVisual Studio의 주 창에서 데이터 파일의 요약 뷰를 자동으로 로드합니다.The profiler generates a profiling data (*.vsp) file, lists the file name in the Reports section of the Performance Explorer window, and automatically loads the Summary view of the data file in the main window of Visual StudioVisual Studio.

샘플링된 프로파일링 결과를 분석하려면To analyze sampled profiling results

  1. 요약 뷰에는 프로파일링 실행 과정 동안의 CPU 사용률 시간 표시 막대, 가장 활발하게 사용된 응용 프로그램 호출 트리의 분기를 나타내는 실행 부하 과다 경로 목록, 그리고 자체 함수 본문에서 코드를 실행하는 동안 가장 많이 샘플링된 함수를 보여 주는 개별 작업이 가장 많은 함수의 목록이 표시됩니다.The Summary view displays a timeline of the CPU utilization over the course of the profiling run, the Hot Path list that represents the branch of the application's call tree that was most active, and a list of the Functions Doing Most Individual Work that shows the functions that were most heavily sampled while executing code in their own function body.

    실행 부하 과다 경로 목록을 조사하여 목록 끝부분에 있는 PeopleTrax 함수가 PeopleNS.People.GetNames 메서드임을 확인합니다.Examine the Hot Path list and notice that the PeopleNS.People.GetNames method is the PeopleTrax function closest to the end of the list. 이 메서드의 위치를 분석하면 효율적입니다.Its position makes it a good candidate for analysis. 함수 이름을 클릭하여 함수 정보 뷰에서 GetNames의 정보를 표시합니다.Click the function name to display details of GetNames in the Function Details view.

  2. 함수 정보 뷰에는 두 개의 창이 있습니다.The Function Details view contains two windows. 비용 배분 창에서는 함수가 수행한 작업, 해당 함수가 호출한 함수가 수행한 작업, 그리고 샘플링된 인스턴스 수에서 함수를 호출한 함수가 차지하는 비율을 보여 주는 그래픽 뷰가 제공됩니다.The cost distribution window provides a graphical view of the work done by the function, the work done by the functions that it called, and the contribution of functions that called the function to the number of instances that were sampled. 함수 이름을 클릭하면 뷰에서 포커스가 설정된 함수를 변경할 수 있습니다.You can change the function that is the focus of the view by clicking a function name. 예를 들어 PeopleNS.People.GetPeople을 클릭하여 GetPeople을 선택된 함수로 설정할 수 있습니다.For example, you can click PeopleNS.People.GetPeople to make GetPeople the selected function.

    함수 코드 뷰 창에는 함수의 소스 코드(사용 가능한 경우)가 표시되며, 선택한 함수에서 가장 비용이 높은 줄이 강조 표시됩니다.The Function Code View window shows you the source code for the function if it is available and highlights the most expensive lines in the selected function. GetNames를 선택하면 이 함수가 응용 프로그램 리소스에서 문자열을 읽은 다음 StringReader를 사용하여 문자열의 각 줄을 ArrayList에 추가함을 확인할 수 있습니다.When GetNames is selected, you can see that this function reads a string from the application resources and then uses a StringReader to add each line in the string to an ArrayList. 이 함수를 최적화하는 확실한 방법은 없습니다.There is no obvious way to optimize this function.

  3. GetNames의 호출자는 PeopleNS.People.GetPeople뿐이므로 비용 배분 창에서 GetPeople을 클릭하여 해당 코드를 조사합니다.Because PeopleNS.People.GetPeople is the only caller of GetNames, click GetPeople in the cost distribution window to examine its code. 이 메서드는 GetNames에 의해 생성된 사용자 및 회사 이름에서 PersonInformationNS.PersonInformation 개체의 ArrayList를 반환합니다.This method returns an ArrayList of PersonInformationNS.PersonInformation objects from the names of people and companies produced by GetNames. 그러나 GetNames는 PersonInformation 개체를 만들 때마다 두 번 호출됩니다.However, GetNames is called twice every time that a PersonInformation object is created. 메서드 시작 시에 목록을 한 번만 만들고, PersonInformation 만들기 루프 중에 해당 목록으로 인덱싱하면 메서드를 쉽게 최적화할 수 있습니다.You can see that the method can be easily optimized by creating the lists only once at the start of the method and indexing into those lists during the PersonInformation creation loop.

  4. 샘플 응용 프로그램 코드에서는 GetPeople의 대체 버전이 제공되며, 빌드 속성에 조건부 컴파일 기호를 추가하면 최적화된 함수를 호출할 수 있습니다.An alternative version of GetPeople is provided with the sample application code and you can call the optimized function by adding a conditional compilation symbol to the build properties. 솔루션 탐색기 창에서 People 프로젝트를 마우스 오른쪽 단추로 클릭하고 속성을 클릭합니다.In the Solution Explorer window, right-click the People project and then click Properties. 속성 페이지 메뉴에서 빌드를 클릭한 다음 조건부 컴파일 기호 텍스트 상자에 OPTIMIZED_GETPEOPLE을 입력합니다.Click Build on the property page menu and then type OPTIMIZED_GETPEOPLE in the Conditional compilation symbol text box. 다음 빌드에서 원래 메서드가 최적화된 버전의 GetPeople로 바뀝니다.The optimized version of GetPeople replaces the original method in the next build.

  5. 성능 세션을 다시 실행합니다.Rerun the performance session. 성능 탐색기 도구 모음에서 프로파일링 시작을 클릭합니다.On the Performance Explorer toolbar, click Launch with Profiling. 사용자 가져오기, 데이터 내보내기를 차례로 클릭합니다.Click Get People and then click Export Data. 표시되는 메모장 창을 닫고 PeopleTrax 응용 프로그램을 닫습니다.Close the Notepad window that appears and then close the People Trax application.

    새 프로파일링 데이터 파일이 생성되고 새 데이터의 요약 뷰가 Visual StudioVisual Studio 주 창에 표시됩니다.A new profiling data file is generated, and a Summary view for the new data appears in the Visual StudioVisual Studio main window.

  6. 두 프로파일링 실행을 비교하려면 성능 탐색기에서 두 데이터 파일을 선택하고 마우스 오른쪽 단추로 클릭한 다음 성능 보고서 비교를 클릭합니다.To compare the two profiling runs, select the two data files in the Performance Explorer, right-click the files, and then click Compare Performance Reports. 그러면 Visual StudioVisual Studio 주 창에 비교 보고서 창이 나타납니다.A Comparison Report window appears in the Visual StudioVisual Studio main window. 델타 열에 함수의 성능 값이 이전 기준 값과 이후 비교 값으로 변경된 내용이 표시됩니다.The Delta column shows the change in the performance value of functions from the earlier Baseline value to the later Comparison value. 드롭다운 목록에서 비교할 값을 선택할 수 있습니다.You can select the values to compare from the Column drop down list. 포괄 샘플 비율(%)을 선택합니다.Select Inclusive Samples %.

    GetPeople 및 GetNames 메서드의 성능이 크게 향상되었음을 확인할 수 있습니다.Notice that the GetPeople and GetNames methods show considerable performance gains.

계측 방법을 사용하여 프로 파일링Profiling by Using the Instrumentation Method

계측은 프로파일러가 프로브 함수를 프로파일링된 이진 파일의 특수하게 빌드된 버전에 삽입하는 프로파일링 방법입니다. Instrumentation is a profiling method in which the profiler inserts probe functions into specially built versions of the profiled binaries. 프로브는 계측된 모듈에서 함수의 진입 및 종료 시에, 그리고 해당 함수의 모든 호출 사이트에서 타이밍 정보를 수집합니다.The probes collect timing information at the entry and exit of functions in the instrumented modules and at all call site in those functions. 계측 프로세스는 네트워크에서 통신하고 디스크에 쓰는 등의 입/출력 작업과 관련된 문제를 조사하는 데 유용합니다.The instrumentation process is useful for investigating issues related to input/output operations such as writing to disk and communicating over a network. 계측에서는 샘플링에 비해 더 자세한 정보를 제공하지만, 프로세스 실행이 보다 주입식이며 오버헤드가 더 많이 발생합니다.Instrumentation provides more detailed information than sampling, but it is more intrusive in process execution and incurs a greater amount of overhead. 계측된 이진 파일도 디버그 또는 릴리스 이진 파일보다 더 크므로 배포할 수 없습니다.Instrumented binaries are also larger than debug or release binaries and are not intended for deployment.

연습의 이 섹션에서는 계측 방법을 사용하여 앞에서 프로파일링한 PeopleTrax 응용 프로그램에서 최적화할 수 있는 코드를 추가로 검색합니다.In this section of the walkthrough, we will use the instrumentation method to discover more code we can optimize in the PeopleTrax application we profiled previously. 그리고 요약 뷰 시간 표시 막대의 필터를 사용하여 사용자 목록이 메모장 파일에 작성되는 프로파일링된 응용 프로그램의 데이터 내보내기 시나리오에 대한 분석을 중점적으로 수행합니다.By using the filter of the Summary view timeline, we will focus our analysis on the export data scenario in our profiled application in which the list of people is written to a Notepad file.

계측 방법을 사용하여 기존 응용 프로그램을 프로파일링하려면To profile an existing application by using the instrumentation method

  1. 필요한 경우 Visual Studio에서 PeopleTrax 응용 프로그램을 엽니다.If necessary, open the PeopleTrax application in Visual Studio.

    관리자 권한으로 Visual Studio를 실행 중이며, 솔루션의 빌드 구성이 릴리스로 설정되어 있는지 확인합니다.Make sure that you are running as Administrator and that the build configuration for the solution is set to Release.

  2. 성능 탐색기에서 계측을 클릭합니다.In Performance Explorer, click Instrumentation.

  3. 성능 탐색기 도구 모음에서 프로 파일링 시작을 클릭합니다.On the Performance Explorer toolbar, click the Launch with Profiling.

    프로파일러에서 프로젝트를 빌드하고 응용 프로그램 프로파일링을 시작합니다.The profiler builds the project and starts to profile the application. PeopleTrax 응용 프로그램 창이 나타납니다.The PeopleTrax application window appears.

  4. 사용자 가져오기를 클릭합니다.Click Get People.

    PeopleTrax 데이터 표에 데이터가 채워집니다.The PeopleTrax data grid populates with data.

  5. 10초 정도 기다렸다가 데이터 내보내기를 클릭합니다.Wait for about 10 seconds and then click Export Data.

    메모장이 시작되고 PeopleTrax의 사용자 목록이 들어 있는 새 파일이 표시됩니다.Notepad starts and displays a new file that contains a list of people from PeopleTrax. 잠시 기다리면 필터링을 위한 데이터 내보내기 절차를 보다 쉽게 확인할 수 있습니다.Waiting enables you to more easily identify the data export procedure for filtering.

  6. 메모장을 닫은 다음 PeopleTrax 응용 프로그램을 닫습니다.Close Notepad, and then close PeopleTrax application.

    Visual StudioVisual Studio에서 성능 세션 보고서(.vsp)를 생성합니다. generates a performance session report (.vsp).

계측된 프로파일링 결과를 분석하려면To analyze instrumented profiling results

  1. 보고서 요약 뷰의 시간 표시 막대 그래프에는 프로파일링 실행 과정 동안 프로그램의 CPU 사용률이 표시됩니다.The timeline graph of the Summary view of the report shows the CPU utilization of the program over the duration of the profiling run. 데이터 내보내기 작업의 경우 그래프 오른쪽의 CPU 사용률이 크게 높아지거나 안정적으로 유지됩니다.The export data operation should be the large peak or plateau on the right side of the graph. 성능 세션을 필터링하여 내보내기 작업에서 수집된 데이터만 표시하고 분석할 수 있습니다.We can filter the performance session to display and analyze only the data that was collected in the export operation. 데이터 내보내기 작업이 시작된 그래프상의 지점 왼쪽을 클릭합니다.Click to the left of the point on the graph where the export data operation begins. 해당 작업의 오른쪽을 다시 클릭합니다.Click again to the right side of the operation. 그런 다음 시간 표시 막대 오른쪽의 링크 목록에서 선택 필터를 클릭합니다.Then click Filter by Selection in the list of links to the right of the timeline.

    실행 부하 과다 경로 트리에는 PeopleTrax.Form1.ExportData 메서드에 의해 호출된 Concat 메서드가 작업 시간 중 대부분을 사용함이 표시됩니다.The Hot Path tree show that the Concat method that is called by PeopleTrax.Form1.ExportData method consumes a large percentage of the time. System.String.Concat개별 작업이 가장 많은 함수 목록에서도 맨 위에 있으므로 이 함수에 소요되는 시간을 줄이는 것이 최적화에서 중요한 작업일 가능성이 높습니다.Because System.String.Concat is also at the top of the Functions With Most Individual Work list, reducing the time spent in the function is a likely point of optimization.

  2. 요약 테이블 중 하나에서 System.String.Concat를 두 번 클릭하여 함수 정보 뷰에서 자세한 내용을 확인합니다.Double-click System.String.Concat in either of the summary tables to see more information in the Function Details view.

  3. Concat를 호출하는 메서드는 PeopleTrax.Form1.ExportData뿐임을 확인할 수 있습니다.You can see that the PeopleTrax.Form1.ExportData is the only method that calls Concat. 호출 함수에서 PeopleTrax.Form1.ExportData를 클릭하여 함수 정보 뷰의 대상으로 해당 메서드를 선택합니다.Click PeopleTrax.Form1.ExportData in the Calling Functions list to select the method is as the target of the Function Details view.

  4. 함수 코드 뷰 창에서 메서드를 검사합니다.Examine the method in the Function Code View window. System.String.Concat에 대한 리터럴 호출은 없습니다.Notice that there are no literal calls to System.String.Concat. 대신 += 피연산자는 여러 번 사용됩니다. 컴파일러는 이 피연산자를 System.String.Concat 호출로 바꿉니다.Instead, there are several uses of the += operand, which the compiler replaces with calls to System.String.Concat. .NET Framework에서는 문자열을 수정하면 새 문자열이 할당됩니다.Any modifications to a string in the .NET Framework cause a new string to be allocated. .NET Framework에는 문자열 연결용으로 최적화된 StringBuilder 클래스가 포함되어 있습니다.The .NET Framework includes a StringBuilder class that is optimized for string concatenation

  5. 이 문제 영역을 최적화된 코드로 바꾸려면 PeoplexTrax 프로젝트의 조건부 컴파일 기호로 OPTIMIZED_EXPORTDATA를 추가합니다.To replace this problem area with optimized code, add OPTIMIZED_EXPORTDATA as a conditional compilation symbol to the PeopleTrax project.

  6. 솔루션 탐색기에서 PeopleTrax 프로젝트를 마우스 오른쪽 단추로 클릭하고 속성을 클릭합니다.In Solution Explorer, right-click the PeopleTrax project and then click Properties.

    PeopleTrax 프로젝트 속성 폼이 나타납니다.The PeopleTrax project properties form appears.

  7. 빌드 탭을 클릭합니다.Click the Build tab.

  8. 조건부 컴파일 기호 텍스트 상자에 OPTIMIZED_EXPORTDATA를 입력합니다.In the Conditional Compilation Symbols text box, type OPTIMIZED_EXPORTDATA.

  9. 프로젝트 속성 폼을 닫고 메시지가 표시되면 모두 저장을 선택합니다.Close the project property form and choose save all when you are prompted.

    응용 프로그램을 다시 실행하면 성능이 현저히 향상 되었음을 확인할 수 있습니다.When you run the application again, you will see marked improvements in performance. 성능이 사용자가 체감할 수 있도록 향상되더라도 프로파일링 세션을 다시 실행하는 것이 좋습니다.It is recommended that you run the profiling session again, even if there are user visible improvements in performance. 첫 번째 문제로 인해 다른 문제는 명확하게 드러나지 않았을 수도 있으므로, 문제를 해결한 후에 데이터를 검토해야 합니다.Reviewing the data after you fix a problem is important because the first problem might obscure some other problem.

참고 항목See Also

개요 Overviews
시작 Getting Started
/Z7, /Zi, /ZI(디버깅 정보 형식)/Z7, /Zi, /ZI (Debug Information Format)