c++ - 코드 - 힙 프로파일 링




권장 오픈 소스 프로파일 러 (4)

목록에있는 사람들로부터 Luke Stackwalker가 가장 잘 작동하는 것으로 나타났습니다. GUI가 마음에 들었습니다. 실행하기 쉽습니다.

비슷한 다른 기능인 Very Sleepy - 유사한 기능, 샘플링이 더 안정적이며, GUI가 사용하기에 다소 어려움 (그래픽이 아님).

그들과 더 많은 시간을 보낸 후에 나는 아주 중요한 단점을 발견했습니다. 두 가지 방법 모두 1ms 분해능으로 샘플링을 시도하지만 실제로 샘플링 방법 (첨부 된 프로세스의 StackWalk64)이 너무 느리기 때문에 실제로는 달성하지 못합니다. 내 응용 프로그램의 경우 콜 스택 (callstack)을 얻으려면 5-20ms가 걸립니다. 이렇게하면 결과가 정확하지 않을뿐만 아니라 짧은 콜 스택이 더 빨리 걸리므로 결과가 왜곡됩니다. 따라서 더 많은 히트를 얻는 경향이 있습니다.

나는 $$$을 지불해야하는 상업용 프로파일 러 중 하나를 사용하기보다는 오픈 소스 프로파일 러를 찾으려고 노력하고 있습니다. 소스 포지 (SourceForge)에서 검색을 수행했을 때 나는 매우 유망하다고 생각되는이 4 가지 C ++ 프로파일 러를 발견했습니다.

  1. Shiny : C ++ 프로파일 러
  2. 저지방 프로파일 러
  3. 루크 스택 워커
  4. FreeProfiler

나는 어떤 프로파일 러 중 하나가 내 프로그램의 성능에 대해 배우는 측면에서 가장 좋은 것인지 잘 모르겠습니다. 몇 가지 제안을 듣는 것이 좋을 것입니다.


오픈 소스가 아니지만 AMD CodeAnalyst 는 무료입니다. 그 이름에도 불구하고 인텔 CPU에서도 작동합니다. Windows (Visual Studio 통합 포함)와 Linux 모두에 사용할 수있는 버전이 있습니다.


이를 수행하는 데는 한 가지 이상의 방법이 있습니다.

프로파일 러를 사용하지 않는 방법을 잊지 마십시오.

대부분의 프로파일 러는 1) 타이밍의 높은 통계적 정확성 (많은 샘플)과 2) 문제 식별 (기능 및 콜 그래프)의 낮은 정밀도가 필요하다고 가정합니다.

우선 순위는 바뀔 수 있습니다. 즉, 비용 정밀도가 샘플 수의 함수 인 동안 문제는 정확한 기계 주소에 위치 할 수 있습니다.

대부분의 실제 문제는 고정밀도가 필수적이지 않은 최소한 10 %의 비용이 듭니다.

예 : 무언가가 프로그램을 2 배 길게 만들면 50 %의 비용이 들어가는 코드가 있음을 의미합니다. 속도가 느려지는 동안 호출 스택의 샘플을 10 개 가져 가면 코드의 정확한 줄이 대략 5 개에 있습니다. 프로그램이 커질수록 문제는 중간 스택에있는 함수 호출 일 가능성이 높습니다.

그것은 반이 intuiitive, 나도 알아.

참고 : xPerf는 거의 거기에 있지만 꽤 (내가 말할 수있는 한). 호출 스택 샘플을 가져 와서 저장합니다. 여기 내가 필요한 것 같아.

  • 원하는 경우에만 샘플을 가져와야합니다. 그대로, 관련없는 것들을 걸러 내야합니다.

  • 스택보기에는 전체 기능뿐만 아니라 전화가 걸리는 특정 회선이나 주소가 표시되어야합니다. (어쩌면이 작업을 수행 할 수 있으며 블로그에서 알 수 없습니다.)

  • 클릭하면 단일 콜 명령 또는 리프 명령어 중심으로 버터 플라이 뷰를 가져오고, CPU 분수가 아니라 해당 명령어가 포함 된 스택 샘플의 비율을 보여줍니다. 그것은 그 명령의 비용을 시간의 일부로서 직접적으로 측정 한 것입니다. (예를 들어,이 작업을 수행 할 수는 있지만 말할 수는 없습니다.) 예를 들어, 명령이 파일 열기 또는 스레드를 유휴 상태로하는 다른 호출 인 경우에도 여전히 월 클럭 시간이 소요되므로, 그.

참고 : 필자는 Luke Stackwalker를 살펴 봤는데 동일한 발언이 적용됩니다. 나는 그것이 올바른 방향에 있다고 생각하지만 UI 작업이 필요합니다.

추가 : LukeStackwalker를보다 신중하게 검토 한 결과, 함수를 측정하는 것이 구문을 찾는 것보다 더 중요하다는 가정에 희생됩니다. 따라서 호출 스택의 각 샘플에서 함수 수준의 타이밍 정보를 업데이트하지만 줄 번호 정보로 수행하는 모든 함수는 각 함수의 최소 및 최대 줄 번호를 추적합니다. 멀리 떨어져. 그래서 기본적으로 줄 정보 인 가장 중요한 정보를 버립니다. 중요한 이유는 함수를 최적화하기로 결정한 경우 함수가 필요한 라인이 무엇인지 알 필요가 있습니다. 그리고 그 라인은 스택 샘플에 있습니다 (파기되기 전에).

라인 번호 정보가 유지되면 스토리지가 빨리 소모 될 수 있다고 반대 할 수도 있습니다. 두 가지 대답. 1) 샘플에 나타나는 라인이 너무 많아 반복적으로 나타납니다. 2) 너무 많은 표본이 필요하지 않습니다. 높은 통계적 정확도의 측정이 필요하다는 가정은 항상 있었지만 정당화 된 것은 아닙니다.

xPerf와 같은 다른 스택 샘플러도 비슷한 문제가 있다고 생각합니다.






profiler