프로파일링(컴퓨터 프로그래밍)
Profiling (computer programming)시리즈의 일부 |
소프트웨어 개발 |
---|
소프트웨어 엔지니어링에서 프로파일링(「프로그램 프로파일링」, 「소프트웨어 프로파일링」)은, 프로그램의 공간(메모리)이나 시간의 복잡성, 특정 명령의 사용, 함수 호출의 빈도와 지속 시간등을 측정하는 동적 프로그램 분석의 한 형태입니다.대부분의 경우 프로파일링 정보는 프로그램 최적화, 특히 성능 엔지니어링에 도움이 됩니다.
프로파일링은 프로파일러(또는 코드 프로파일러)라는 도구를 사용하여 프로그램 소스 코드 또는 바이너리 실행 파일 형식을 계측함으로써 이루어집니다.프로파일러는 이벤트 기반, 통계, 계측 및 시뮬레이션 방법 등 다양한 기술을 사용할 수 있습니다.
프로그램 이벤트 수집
프로파일러는 하드웨어 인터럽트, 코드 인스트루먼트, 명령어세트 시뮬레이션, 운영체제 후크, 퍼포먼스카운터 등 다양한 기술을 사용하여 데이터를 수집합니다.
프로파일러 사용

프로그램 분석 도구는 프로그램 동작을 이해하는 데 매우 중요합니다.컴퓨터 설계자는 프로그램이 새로운 아키텍처에서 얼마나 잘 수행되는지 평가하기 위해 이러한 도구를 필요로 합니다.소프트웨어 라이터에는 프로그램을 분석하고 코드의 중요한 섹션을 식별하기 위한 도구가 필요합니다.컴파일러 라이터는 명령 스케줄링 또는 분기 예측 알고리즘이 얼마나 잘 수행되는지 알아보기 위해 이러한 도구를 사용하는 경우가 많습니다.
--
프로파일러의 출력은 다음과 같습니다.
- 관찰된 사건의 통계적 요약(프로파일)
- 요약 프로파일 정보는 이벤트가 발생한 소스 코드 문에 대해 주석을 달아 표시되는 경우가 많기 때문에 측정 데이터의 크기는 프로그램의 코드 크기와 선형적입니다.
/* ------------------------------------------------------------------------------------------------------- X = "A" 0055 0002인 경우 0003을 XCOUNT 0032 0004 ELS 0005에 1을 추가합니다.
- 기록된 이벤트의 스트림(트레이스)
- 시퀀셜 프로그램의 경우 보통 요약 프로파일로 충분하지만 병렬 프로그램의 성능 문제(메시지 대기 또는 동기화 문제)는 이벤트의 시간 관계에 따라 달라지기 때문에 발생하는 상황을 파악하기 위해 완전한 트레이스가 필요합니다.
- (전체) 트레이스의 크기는 프로그램의 명령 경로 길이에 선형이므로 다소 비현실적입니다.따라서 프로그램의 한 지점에서 트레이스를 시작하고 다른 지점에서 종료하여 출력을 제한할 수 있습니다.
- 하이퍼바이저와의 지속적인 상호작용(화면 표시를 통한 지속적인 또는 정기적인 모니터링 등)
- 이것에 의해, 실행중의 임의의 시점에서 트레이스를 온/오프 할 수 있을 뿐만 아니라, (실행중의) 프로그램에 관한 진행중의 메트릭을 표시할 수 있습니다.또한 중요한 지점에서 비동기 프로세스를 일시 중단하여 다른 병렬 프로세스와의 상호작용을 보다 자세히 조사할 수도 있습니다.
프로파일러는 개별 메서드에 적용하거나 모듈 또는 프로그램의 규모에 따라 장기 실행 코드를 명확히 [1]함으로써 성능 병목 현상을 식별할 수 있습니다.프로파일러는 다양한 런타임 조건[2] 또는 다양한 [3]부하를 처리하도록 최적화하기 위해 타이밍 관점에서 코드를 이해하기 위해 사용할 수 있습니다.프로파일링 결과는 프로파일 가이드 [4]최적화를 제공하는 컴파일러에 의해 수집될 수 있습니다.프로파일링 결과는 개별 알고리즘의 설계 및 최적화를 안내하기 위해 사용할 수 있습니다.예를 [5]들어 와일드 카드와 일치하는 크라우스 알고리즘이 있습니다.프로파일러는 일부 애플리케이션 성능 관리 시스템에 내장되어 있으며, 프로파일링 데이터를 집계하여 분산된 애플리케이션의 [6]트랜잭션 워크로드에 대한 통찰력을 제공합니다.
역사
성능 분석 도구는 1970년대 초부터 IBM/360 및 IBM/370 플랫폼에 존재했으며, 일반적으로 프로그램 상태 워드(PSW)를 타이머 간격으로 기록하여 코드 실행 [citation needed]시 "핫 스팟"을 감지하는 타이머 인터럽트를 기반으로 합니다.이것은 샘플링의 초기 예시입니다(아래 참조).1974년 초에 명령 집합 시뮬레이터는 완전한 추적 및 기타 성능 모니터링 [citation needed]기능을 허용했습니다.
Unix에 대한 Profiler에 의한 프로그램 분석은 Unix 시스템에 기본 툴이 포함되어 있던 [7]1973년으로 거슬러 올라간다.prof
각 기능과 사용된 프로그램 실행 시간을 나열합니다.1982년에gprof
완전한 콜그래프 [8]분석으로 개념을 확장했습니다.
1994년, Digital Equipment Corporation의 Amibh Srivastava와 Alan Eustace는 ATOM(Analysis Tools with OM)에 관한[9] 논문을 발표했습니다.ATOM 플랫폼은 프로그램을 자체 프로파일러로 변환합니다.컴파일 시 분석 대상 프로그램에 코드를 삽입합니다.그 삽입된 코드는 분석 데이터를 출력합니다.프로그램 자체를 분석하기 위해 프로그램을 수정하는 이 기술을 "계장"이라고 합니다.
2004년, 양자는gprof
ATOM 논문은 1999년에 [10]끝난 20년간 가장 영향력 있는 PLDI 논문 50개 목록에 올랐다.
출력에 근거한 프로파일러 타입
플랫 프로파일러
플랫 프로파일러는, 콜로부터 평균 콜 시간을 계산해, 착신측 또는 콘텍스트에 근거해 콜 시간을 분할하지 않습니다.
콜그래프 프로파일러
콜 그래프[8] 프로파일러는 콜 시간, 함수의 빈도 및 착신자를 기반으로 관련된 콜 체인을 표시합니다.일부 도구에서는 전체 컨텍스트가 유지되지 않습니다.
입력에 민감한 프로파일러
입력에 민감한 프로파일러는[11][12][13] 입력 크기나 입력 값 등 입력 워크로드의 기능에 퍼포먼스 척도를 관련지어 플랫 또는 콜그래프 프로파일러에 한층 더 차원을 더합니다.이들은 입력의 함수로 애플리케이션 성능이 어떻게 확장되는지를 특징짓는 차트를 생성합니다.
프로파일러 유형의 데이터 정밀도
프로그램 자체이기도 한 프로파일러는 대상 프로그램의 실행 정보를 수집하여 대상 프로그램을 분석합니다.프로파일러는 데이터의 정밀도에 따라 정보를 수집하는 방법에 따라 이벤트 기반 프로파일러 또는 통계 프로파일러로 분류됩니다.프로파일러는 정보를 수집하기 위해 프로그램 실행을 중단하므로 시간 측정의 분해능이 제한될 수 있으며, 이는 신중하게 받아들여야 합니다.기본 블록 프로파일러는 코드 각 행의 실행에 전념하는 머신클럭 사이클의 수, 또는 그것들을 합산한 타이밍을 보고합니다.기본 블록별로 보고되는 타이밍은 캐시 적중과 [14][15]누락의 차이를 반영하지 않을 수 있습니다.
이벤트 기반 프로파일러
아래 나열된 프로그래밍 언어에는 이벤트 기반 프로파일러가 있습니다.
- Java: JVMTI(JVM Tools Interface) API는 호출, 클래스 로드, 언로드, 스레드 입력 탈퇴 등의 이벤트를 트랩하기 위해 프로파일러에 후크를 제공합니다.
- .NET: 프로파일링 API를 사용하여 COM 서버로서의 프로파일링 에이전트를 CLR에 연결할 수 있습니다.Java와 마찬가지로 런타임은 메서드 JIT / enter / leave, 객체 생성 등의 이벤트를 트랩하기 위해 에이전트에 다양한 콜백을 제공합니다.프로파일링 에이전트가 임의의 방법으로 타깃응용 프로그램의 바이트 코드를 다시 쓸 수 있다는 점에서 특히 강력합니다.
- Python: Python 프로파일링에는 프로파일 모듈, 핫샷(콜 그래프 기반), 'sys' 사용 등이 포함됩니다.setprofile' 함수는 c_{call, return, python_{call, return, python} 등의 이벤트를 트랩합니다.
- Ruby: Ruby는 또한 프로파일링을 위해 Python과 유사한 인터페이스를 사용합니다.profile.rb, module 및 ruby-prof의 C 확장자에 플랫 프로파일러가 있습니다.
통계 프로파일러
일부 프로파일러는 샘플링으로 동작합니다.샘플링 프로파일러는 운영체제 인터럽트를 사용하여 타깃 프로그램의 콜스택을 정기적으로 프로브합니다.샘플링 프로파일은 일반적으로 수치적으로 정확하고 구체적이지 않지만 타깃 프로그램을 거의 최대 속도로 실행할 수 있습니다.
결과 데이터는 정확하지 않지만 통계적 근사치입니다."실제 오차량은 보통 여러 샘플링 주기입니다.실제로 값이 샘플링 주기의 n배일 경우 예상되는 오차는 [16]n 샘플링 주기의 제곱근입니다.
실제로 샘플링 프로파일러는 타깃 프로그램에 대한 간섭이 적기 때문에 (메모리 캐시나 명령 디코딩 파이프라인과 같은) 부작용이 적기 때문에 다른 접근법보다 더 정확한 타깃 프로그램 실행 그림을 제공할 수 있습니다.또한 실행 속도에 큰 영향을 주지 않기 때문에 숨겨져 있던 문제를 검출할 수 있습니다.그들은 또한 종종 작은 루틴이나 '딱한' 루프의 비용을 과대평가하는 것에 대해 상대적으로 면역이 된다.시스템 콜 처리 등 사용자 모드와 인터럽트 가능한 커널모드의 상대적인 시간을 표시할 수 있습니다.
그러나 인터럽트를 처리하기 위한 커널 코드는 CPU 사이클의 약간의 손실, 캐시 사용률 전환, 무정전 커널 코드(마이크로초 범위 액티비티)에서 발생하는 다양한 작업을 구별할 수 없습니다.
전용 하드웨어는 이 외에도 다음과 같은 경우가 있습니다.ARM Cortex-M3 및 일부 최신 MIPS 프로세서 JTAG 인터페이스에는 PCSAMPLE 레지스터가 있습니다.이 레지스터는 프로그램카운터를 검출할 수 없는 방법으로 샘플링하여 플랫프로파일의 침입 없는 수집을 가능하게 합니다.
Java/managed 코드에 일반적으로[17] 사용되는 통계 프로파일러로는 SmartBear Software의 AQtime과[18] Microsoft의 CLR [19]Profiler가 있습니다.이러한 프로파일러는 Apple Inc.의 Shark(OSX),[20] OProfile(Linux),[21] Intel VTune 및 Parallel Amplyzer([22]Intel Parallel Studio의 일부), Oracle Performance Analyzer 등과 함께 네이티브 코드 프로파일링도 지원합니다.
인스트루먼트
이 기술은 필요한 정보를 수집하기 위한 명령을 대상 프로그램에 효과적으로 추가합니다.프로그램을 계측하면 성능 변화가 발생할 수 있으며 경우에 따라 결과가 부정확하거나 하이젠버그가 발생할 수 있습니다.이 효과는 수집되는 정보, 보고되는 타이밍 상세 수준 및 기본 블록프로파일이 [23]계측과 함께 사용되는지 여부에 따라 달라집니다.예를 들어, 모든 프로시저/루틴 콜을 카운트하기 위한 코드를 추가하는 것은 각 스테이트먼트가 준수되는 횟수를 카운트하는 것보다 영향이 적을 수 있습니다.일부 컴퓨터에는 정보를 수집하기 위한 특수 하드웨어가 있습니다.이 경우 프로그램에 미치는 영향은 최소화됩니다.
프로파일러가 사용할 수 있는 제어 수준과 시간 분해능을 결정하기 위해서는 계측이 중요합니다.
- 매뉴얼: Application Response Measurement 표준과 같은 측정 API에 실행 시간 계산, 이벤트 또는 호출 수를 명시적으로 계산하는 명령을 추가하는 등 프로그래머에 의해 수행됩니다.
- 자동 소스 레벨: 계측 정책에 따라 자동 툴에 의해 소스 코드에 추가된 계측.
- 중간 언어: 어셈블리 또는 디컴파일된 바이트 코드에 추가되는 계측으로, 복수의 상위 레벨의 소스 언어를 서포트해, 바이너리 오프셋의 재기입 문제를 회피합니다.
- 컴파일러 지원
- 바이너리 변환:이 도구는 컴파일된 실행 파일에 계측을 추가합니다.
- 런타임 계측:실행 직전에 코드가 계측됩니다.프로그램 실행은 도구에 의해 완전히 감독되고 제어됩니다.
- 런타임 주입:런타임 계측보다 경량.코드가 런타임에 수정되어 도우미 함수로 점프합니다.
인터프리터 계측
- 인터프리터 디버깅옵션을 사용하면 인터프리터가 각 타깃스테이트먼트를 검출할 때 퍼포먼스메트릭 수집을 이노블로 할 수 있습니다.바이트 코드, 제어 테이블 또는 JIT 인터프리터는 일반적으로 타깃 코드의 실행을 완전히 제어할 수 있는 세 가지 예입니다. 따라서 매우 포괄적인 데이터 수집 기회가 제공됩니다.
하이퍼바이저/시뮬레이터
- 하이퍼바이저: 데이터는 하이퍼바이저에서 변경되지 않은 프로그램을 실행하여 수집됩니다.예: SIMMON
- 시뮬레이터 및 하이퍼바이저: 명령 집합 시뮬레이터에서 수정되지 않은 프로그램을 실행하여 인터랙티브하고 선택적으로 수집한 데이터입니다.
「 」를 참조해 주세요.
- 알고리즘 효율
- 벤치마크
- 자바 퍼포먼스
- 퍼포먼스 분석 도구 목록
- PAPI는 최신 마이크로프로세서의 하드웨어 성능 카운터에 대한 휴대용 인터페이스(라이브러리 형식)입니다.
- 퍼포먼스 엔지니어링
- 퍼포먼스 예측
- 퍼포먼스 튜닝
- 런타임 검증
- 프로파일 가이드 최적화
- 정적 코드 분석
- 소프트웨어 고고학
- Worst-Case Execution Time(WCET; 최악의 경우 실행 시간)
레퍼런스
- ^ "How to find the performance bottleneck in C# desktop application?". Stack Overflow. 2012.
- ^ Krauss, Kirk J (2017). "Performance Profiling with a Focus". Develop for Performance.
- ^ "What is code profiling? Learn the 3 Types of Code Profilers". Stackify Developer Tips, Tricks and Resources. Disqus. 2016.
- ^ Lawrence, Eric (2016). "Getting Started with Profile Guided Optimization". testslashplain. WordPress.
- ^ Krauss, Kirk (2018). "Matching Wildcards: An Improved Algorithm for Big Data". Develop for Performance.
- ^ "List of .Net Profilers: 3 Different Types and Why You Need All of Them". Stackify Developer Tips, Tricks and Resources. Disqus. 2016.
- ^ UNIX 프로그래머 매뉴얼, 제4판
- ^ a b S.L. Graham, P.B. Kessler 및 M.K. McKusick, gprof, 콜그래프 실행 프로파일러, 컴파일러 구축에 관한 SIGPLAN '82 심포지엄의 진행, SIGPLAN 통지, Vol.17, No.120-126/10i, do: do:
- ^ A. 스리바스타바와 A.Eustace, ATOM: 맞춤형 프로그램 분석 도구 구축 시스템, 프로그래밍 언어 설계 및 구현에 관한 ACM SIGPLAN 회의 진행(PLDI '94), 페이지 196-205, 1994; ACM SIGPLAN 통지 - Best of PLDI 1979-1999 홈페이지 아카이브, Vol.39.
- ^ PLDI 20년(1979~1999년): A Selection, Kathryn S. McKinley 편집자
- ^ E. Copa, C.데메트레스쿠와 나Finocchi, 입력에 민감한 프로파일링, IEEE Trans.소프트웨어 제40(12)호: 1185-1205호(2014년); doi:10.1109/TSE.2014.2339825호
- ^ D. 자파라누크와 M.Hausworth, 알고리즘 프로파일링, 제33회 ACM SIGPLAN Conference on Programming Language Design and Implementation (PLDI 2012), ACM SIGPLAN Notice, Vol. 47, No. 6, 페이지 67-76, 2012, do:10.11452/64402.
- ^ T. Kustner, J. Weidendorfer 및 T.Weinzierl, Argument Controlled Profiling, Euro-Par 2009 – 병렬처리 워크숍, 컴퓨터 사이언스 강의 노트, Vol. 6043, 페이지 177-184, 2010; doi: 10.1007/978-3-642-14122-5 22
- ^ "Timing and Profiling - Basic Block Profilers". OpenStax CNX Archive.
- ^ Ball, Thomas; Larus, James R. (1994). "Optimally profiling and tracing programs" (PDF). ACM Transactions on Programming Languages and Systems. ACM Digital Library. 16 (4): 1319–1360. doi:10.1145/183432.183527. S2CID 6897138. Archived from the original (PDF) on 2018-05-18. Retrieved 2018-05-18.
- ^ 2012-05-29 웨이백머신에서 아카이브된 출력의 통계적 부정확성
- ^ "Popular C# Profilers". Gingtage. 2014.
- ^ "Sampling Profiler - Overview". AQTime 8 Reference. SmartBear Software. 2018.
- ^ Wenzal, Maira; et al. (2017). "Profiling Overview". Microsoft .NET Framework Unmanaged API Reference. Microsoft.
- ^ "Performance Tools". Apple Developer Tools. Apple, Inc. 2013.
- ^ Netto, Zanella; Arnold, Ryan S. (2012). "Evaluate performance for Linux on Power". IBM DeveloperWorks.
- ^ Schmidl, Dirk; Terboven, Christian; an Mey, Dieter; Müller, Matthias S. (2013). Suitability of Performance Tools for OpenMP Task-Parallel Programs. Proc. 7th Int'l Workshop on Parallel Tools for High Performance Computing. pp. 25–37. ISBN 9783319081441.
- ^ Carleton, Gary; Kirkegaard, Knud; Sehr, David (1998). "Profile-Guided Optimizations". Dr. Dobb's Journal.
외부 링크
- IBM Rational Application Developer를 사용하여 Java 애플리케이션의 실행 시간 분석을 수행하는 것에 대한 문서 "속도 요구 - 성능 병목 해소"
- VTune Performance Analyzer를 사용한 런타임 생성 및 해석 코드 프로파일링