스택 샘플링을 넘어서 : C ++ 프로파일 러


146

해커의 이야기

날짜는 12/02/10입니다. 크리스마스 전날이 흘렀고 저는 Windows 프로그래머로서 주요 도로 블록에 거의 부딪 쳤습니다. 나는 AQTime을 사용하고 있고, 졸리고, 반짝 거리며, 매우 졸려 보았고, VTune이 설치되고 있습니다. VS2008 프로파일 러를 사용하려고 시도했으며 긍정적으로 처벌을 받았으며 종종 무의미했습니다. 무작위 일시 중지 기술을 사용했습니다. 콜 트리를 검사했습니다. 함수 추적을 해고했습니다. 그러나 문제의 슬픈 고통스러운 사실은 내가 작업하는 앱이 백만 줄 이상의 코드이며 아마도 다른 백만 줄의 타사 앱이 있다는 것입니다.

더 나은 도구가 필요합니다. 다른 주제를 읽었습니다. 각 주제에 나열된 각 프로파일 러를 사용해 보았습니다. 이 엉뚱하고 값 비싼 옵션보다 더 나은 것이 있거나, 거의 이득이없는 음란 한 양의 작업이 있어야합니다. 문제를 더 복잡하게하기 위해, 우리 코드는 스레드가 많고, 많은 Qt 이벤트 루프를 실행하는데, 그 중 일부는 너무 약해서 타이밍 지연으로 인해 무거운 계측에서 충돌합니다. 왜 우리가 여러 이벤트 루프를 실행하는지 묻지 마십시오. 아무도 나에게 말할 수 없습니다.

Windows 환경에서 Valgrind 라인을 따라 추가 옵션이 있습니까?
이미 시도한 긴 도구들보다 더 좋은 것이 있습니까?
큐에 이벤트를 유용하게 표시하여 Qt와 통합하도록 설계된 것이 있습니까?

기울임 꼴에 실제로 유용한 도구와 함께 시도한 도구의 전체 목록 :

  • AQTime : 오히려 좋습니다! 깊은 재귀에 문제가 있지만 이러한 경우 호출 그래프가 정확하며 혼란을 제거하는 데 사용할 수 있습니다. 완벽한 도구는 아니지만 시험해 볼 가치가 있습니다. 그것은 당신의 필요에 맞을 수도 있으며, 대부분의 경우 나에게 충분했습니다.
  • 디버그 모드에서 임의 일시 정지 공격 : 충분한 정보가 충분하지 않습니다.
    좋은 도구이지만 완벽한 솔루션은 아닙니다.
  • 병렬 스튜디오 : 핵 옵션. 눈에 거슬 리고 이상하고 미치도록 강력합니다. 나는 당신이 30 일 평가를 치고 그것이 잘 맞는지 알아 내야한다고 생각합니다. 너무 멋지다.
  • AMD Codeanalyst : 훌륭하고 사용하기 쉽고 충돌이 발생하기 쉽지만 환경 문제라고 생각합니다. 무료이므로 시도해 보는 것이 좋습니다.
  • Luke Stackwalker : 소규모 프로젝트에서 잘 작동합니다. 우리 프로젝트에서 약간의 노력을 기울이고 있습니다. 그래도 좋은 결과가 있으며, 개인적 작업으로 슬리피를 대체합니다.
  • PurifyPlus : Win-x64 환경, 가장 두드러진 Windows 7은 지원되지 않습니다. 다른 부서의 많은 동료들이 맹세합니다.
  • VS2008 프로파일 러 : 필요한 분해능에서 기능 추적 모드에서 100+ 기가 범위의 출력을 생성합니다. 긍정적 인면에서 확실한 결과를 만들어냅니다.
  • GProf : GCC가 어느 정도 효과적이어야합니다.
  • VTune : VTune의 W7은 범죄에 대한 국경을 지원합니다. 그렇지 않으면 우수
  • PIN : 내 도구를 해킹해야하므로 최후의 수단입니다.
  • Sleepy \ VerySleepy : 작은 앱에는 유용하지만 여기서 실패합니다.
  • EasyProfiler : 계측 할 위치를 표시하기 위해 수동으로 삽입 된 코드가 마음에 들지 않으면 나쁘지 않습니다.
  • Valgrind : * nix 만 해당 환경에있을 때 매우 좋습니다.
  • OProfile : Linux 전용.
  • Proffy : 그들은 야생마를 쏴요.

내가 시도하지 않은 제안 도구 :

  • XPerf :
  • 글로우 코드 :
  • 개발자 :

참고 : 현재 인텔 환경. VS2008, 부스트 라이브러리. Qt 4+. 트롤 테크를 통한 Qt / MFC 통합.


이제 : 거의 2 주 후에 문제가 해결 된 것 같습니다. 목록에있는 거의 모든 것을 포함한 몇 가지 개인 트릭을 포함한 다양한 도구 덕분에 우리는 주요 병목 현상을 발견했습니다. 그러나 저는 새로운 테크놀러지뿐만 아니라 새로운 프로파일 러를 계속 테스트하고 탐구하고 시도 할 것입니다. 왜? 내가 너희들에게 빚을 졌기 때문에 너희들은 흔들 리기 때문이다. 타임 라인이 약간 느려지지만 새로운 도구를 계속 사용해 봐서 매우 기쁩니다.

개요
많은 다른 문제들 중에서도 최근 많은 구성 요소가 잘못된 스레딩 모델로 전환되어 우리 밑의 코드가 갑자기 더 이상 멀티 스레딩되지 않았기 때문에 심각한 중단을 일으켰습니다. NDA를 위반하기 때문에 더 이상 말할 수는 없지만 이것이 일상적인 검사 또는 정상적인 코드 검토로는 발견되지 않았 음을 알 수 있습니다. 프로파일 러, 콜 그래프 및 임의의 일시 중지가 없으면 하늘의 아름다운 푸른 호에서 우리의 분노가 계속 비명을 질 것입니다. 고맙게도, 내가 만난 최고의 해커들과 함께 일하며, 훌륭한 도구와 훌륭한 사람들로 가득한 놀라운 '구절에 접근 할 수 있습니다.

젠틀 포크, 나는 이것을 대단히 감사하며, 당신에게 현상금으로 보상 할 충분한 담당자가 없다는 것을 유감스럽게 생각합니다. 나는 아직도 이것이 지금까지 우리가 얻은 것보다 더 나은 답변을 얻는 데 중요한 질문이라고 생각합니다.

결과적으로, 매주 다음 3 주 동안, 나는 내가 감당할 수있는 가장 큰 현상금을 내놓을 것이며, 그것이 상식이 아니라고 생각하는 가장 멋진 도구로 대답 할 것입니다. 3 주 후, 우리가 내 삐걱 거리는 소리를 용서한다면 프로파일 러에 대한 명확한 프로파일을 축적했으면합니다.

테이크 아웃
프로파일 러를 사용하십시오. Ritchie, Kernighan, Bentley 및 Knuth에 충분합니다. 당신이 누구라고 생각하든 상관 없습니다. 프로파일 러를 사용하십시오. 가지고있는 것이 작동하지 않으면 다른 것을 찾으십시오. 찾을 수 없으면 코드를 작성하십시오. 코드를 작성할 수 없거나 약간 끊어 지거나 막힌 경우 임의 일시 중지를 사용하십시오. 다른 방법으로 모두 실패하면 일부 대학원생을 고용하여 프로파일 러를 강타하십시오.


더 긴 전망
그래서 약간의 회고를 작성하는 것이 좋을 것이라고 생각했습니다. 실제로 PIN 도구 위에 구축되어 있기 때문에 Parallel Studios에서 광범위하게 작업하기로 결정했습니다. 관련된 일부 연구자들과 학문을 다루면서 나는 이것이 아마도 어느 정도의 질이라고 생각했다. 고맙게도 나는 옳았다. GUI가 약간 두려운 반면, IPS는 매우 유용하지만 모든 사람에게 편안하게 추천 할 수는 없습니다. 비판적으로, AQT와 다른 많은 프로파일 러가 제공하는 라인 레벨 적중 횟수를 얻는 확실한 방법은 없으며 다른 것들 중에서 분기 선택 속도를 검사하는 데 매우 유용합니다. 순전히, 나는 AQTime을 사용하는 것을 즐겼으며, 그들의 지원이 실제로 반응하는 것을 발견했습니다. 다시, 나는 나의 추천을 받아야한다. 많은 기능이 제대로 작동하지 않으며 Win7x64에서 충돌이 발생하기 쉽습니다. XPerf도 훌륭하게 수행되었지만 특정 종류의 응용 프로그램에서 좋은 판독을 얻는 데 필요한 샘플링 세부 사항에 대해 고통스럽게 느립니다.

지금 당장은 W7x64 환경에서 C ++ 코드를 프로파일 링하는 결정적인 옵션이 없다고 생각하지만 유용한 서비스를 수행하지 못하는 옵션이 있습니다.


18
다른 직업을 구한 적이 있습니까? :)
Nikolai Fetissov 3

10
이 어려운 곳에서 퍼즐을 풀 수있는 다른 곳은? 커널 해킹으로 돌아갈 수있을 것 같지만 지불하지는 않습니다.
Jake Kurzer

3
@ Kos gprof가 -pg로 컴파일 된 gcc 도구 세트를 사용해야하는 경우 gprof.out 파일을 생성하지 않아야한다고 생각합니다. OP의 경우 gprof를 사용하지 않는 msvc를 사용하는 것처럼 들립니다. 다시 목록에있는 다른 사람들이 자신의 요구를 충족시키지 못하면 gprof가 그를 위해 더 나아질 것이라고 생각하지 않습니다
greatwolf

2
@Marc Gravell 충분히 공평하다고 생각합니다 .... 가장 잘 유지되는 게시물이 커뮤니티 도메인으로 갑자기 전달되어 질문이나 답변을 더 많이 업데이트하고 유지하는 상황을 효과적으로 생성한다는 것은 이상한 추론처럼 보입니다. , 커뮤니티의 관점에서 유지 보수에서 벗어나는 것이 적습니다. 이것을 메타로 가져 가야합니까?
Jake Kurzer

2
내가 프로파일 러에 대해 알고있는 것을 감안할 때 누군가 회고를 원합니까?
Jake Kurzer

답변:


65

먼저:

시간 샘플링 프로파일 러는 CPU 샘플링 프로파일 러보다 강력합니다. Windows 개발 도구에 익숙하지 않으므로 어떤 도구인지 알 수 없습니다. 대부분의 프로파일 러는 CPU 샘플링입니다.

CPU 샘플링 프로파일 러는 모든 N 명령어마다 스택 추적을받습니다.
이 기술은 코드에서 CPU 바인딩 된 부분을 보여줍니다. 그것이 응용 프로그램의 병목 인 경우 굉장합니다. 애플리케이션 스레드가 대부분의 시간을 뮤텍스를 놓고 싸우는 데 그리 좋지는 않습니다.

시간 샘플링 프로파일 러는 N 마이크로 초마다 스택 추적을 수행합니다.
이 기술은 "느린" 코드에서 시작됩니다. 원인이 CPU 바운드인지, IO 바운드, 뮤텍스 바운드 또는 캐시 스 래싱 섹션 코드인지 여부 간단히 말해서 어떤 코드 조각이 응용 프로그램 속도를 늦추고 있는지 눈에 띄게됩니다.

따라서 스레드 코드를 프로파일 링 할 때 시간 샘플링 프로파일 러를 사용하십시오.

둘째:

샘플링 프로파일 러는 데이터 덩어리를 생성합니다. 데이터는 매우 유용하지만 쉽게 유용하기에는 너무 많습니다. 프로파일 데이터 비주얼 라이저는 여기서 큰 도움이됩니다. 프로필 데이터 시각화를 위해 찾은 최고의 도구는 gprof2dot 입니다. 이름을 속이지 말고 모든 종류의 샘플링 프로파일 러 출력 (AQtime, Sleepy, XPerf 등)을 처리하십시오. 시각화에서 문제가되는 기능을 지적하면 실제 프로필 데이터로 건너 뛰어 실제 원인이 무엇인지 더 잘 알 수 있습니다.

gprof2dot 도구는 도트 그래프 설명 을 생성 한 다음 graphviz 도구에 제공합니다. 출력은 기본적으로 응용 프로그램에 미치는 영향에 따라 색상 코드가 지정된 콜 그래프입니다. 대체 텍스트

gprof2dot가 멋진 출력을 생성하도록하는 몇 가지 힌트입니다.

  • --skew그래프에서 0.001을 사용 하므로 핫 코드 경로를 쉽게 볼 수 있습니다. 그렇지 않으면 int main()그래프 가 지배적입니다.
  • C ++ 템플릿으로 미친 짓을하고 있다면을 추가하고 싶을 것입니다 --strip. 이것은 특히 Boost와 관련이 있습니다.
  • 샘플링 데이터를 생성하기 위해 OProfile을 사용합니다. 좋은 출력을 얻으려면 타사 및 시스템 라이브러리에서 디버그 기호를로드하도록 구성해야합니다. 그렇지 않으면 CRT가 응용 프로그램 시간의 20 %를 차지하고 있다는 사실을 알게 될 것 malloc입니다.

이것이 이것이 내 문제에 대한 완전한 답인지는 모르지만 gprof2dot은 나의 광대 한 무기고에 들어 갔으며 빠르게 좋아하는 장소를 가정하고 있습니다. 나는 그것이 현상금의 가치가 있다고 생각합니다!
Jake Kurzer

2
나는이 질문에 리눅스 시간 샘플 기반 프로파일 러를 물었다 . OProfile은 결국 시간 기반 샘플링을 가져옵니다. 그들은 매우 높은 품질의 출력을 생성하므로 일단 해당 기능을 추가하면 사용할 것입니다. 그 외에는 친구가 프로파일 링을 위해 gdb + backtrace 솔루션을 함께 해킹했습니다. 매우 해 키지 만 병목 현상을 발견했습니다.
deft_code

@deft_code : "프로파일 링을 위해 gdb + 역 추적 솔루션을 함께 해킹하십시오. 매우 해킹되었지만 병목 현상을 발견했습니다." 당신은 내 끊임없는 소리를 확인하고 있습니다 :) 어떤 사람들은 프로파일 링이 예쁘기를 원 하지만 결과가 필요한 것이라면, 예쁘지 않은 것이 아니라 작동하는 것과 함께 가십시오 .
Mike Dunlavey

Mike Dunlavey에 동의합니다. XPerf / WPA와 같은 것들은 매우 예쁘고 강력 해 보이지만 이러한 도구를 사용하는 방법을 알아내는 데는 시간이 걸리며, 결국에는 일시 중지가 너무 쉬워서 문제를 해결하기위한 더 나은 정보를 제공합니다. 보다 자동화 된 솔루션은 병목 현상을 해결하는 데 필요한 중요한 정보를 필터링하지 않는 것보다 자주 나타납니다.
JDiMatteo

16

무작위 일시 중지를 시도했을 때 어떤 일이 발생 했습니까? 나는 항상 몬스터 앱에서 사용합니다. 정보가 충분하지 않다고 말했으며 고해상도가 필요하다고 제안했습니다. 때때로 사람들은 그것을 사용하는 방법을 이해하는데 약간의 도움이 필요합니다.

VS에서 내가하는 일은 스택 디스플레이를 완전히 읽을 수 없도록하기 때문에 스택 디스플레이를 구성하여 함수 인수를 표시하지 않는 것입니다.

그런 다음 기다리는 동안 "일시 중지" 를 눌러 약 10 개의 샘플을 가져 옵니다 . ^ A, ^ C 및 ^ V를 사용하여 참조 용으로 메모장에 복사합니다. 그런 다음 각각을 연구하여 당시 달성하려는 과정이 무엇인지 알아 내려고 노력합니다.

2 개 이상의 샘플에서 무언가를 달성하려고했는데 그 것이 엄격하게 필요하지 않은 경우 라이브 문제를 발견했으며 얼마나 많은 수정이 절약되는지 알고 있습니다.

정확한 퍼센트는 중요하지 않습니다, 그리고 당신에 대해 아무것도 할 수 없기 때문에 어떤 내부의 제 3 자 코드에가는 것은 중요하지 않다처럼 당신은 정말 알 필요가 없습니다 일이 있습니다 사람들은 . 당신이 할 수있는 일은 각 스택 샘플에 표시 될 수 있는 코드의 풍부한 콜 포인트 세트입니다 . 그것이 당신의 행복한 사냥터입니다.

내가 찾은 종류의 예 :

  • 시작하는 동안 DLL 리소스에서 국제화 된 문자열을 추출하는 과정에서 약 30 층의 깊이가 될 수 있습니다. 실제 문자열을 검사 하면 사용자가 실제로 보지 못하는 문자열처럼 문자열을 국제화 할 필요 가 없다는 것을 쉽게 알 수 있습니다 .

  • 정상적인 사용 중에 일부 코드는 일부 객체에서 Modified 속성을 무심코 설정합니다. 이 객체는 변경 사항을 캡처하고 전체 데이터 구조에 걸쳐 리플 (ripple)되는 알림을 트리거하는 수퍼 클래스에서 제공됩니다. 이것은 알림의 예기치 않은 결과로 많은 일이 발생할 수 있습니다.

  • 셀 단위로 워크 시트를 작성합니다. 값의 배열에서 한 번에 행을 작성하면 훨씬 빠릅니다.

PS 멀티 스레드 인 경우 일시 중지하면 모든 스레드가 일시 중지됩니다. 각 스레드의 호출 스택을 살펴보십시오. 아마도 그들 중 하나만이 진정한 범인이고 다른 사람들은 유휴 상태 일 것입니다.


2
코멘트? 코멘트? 스파르타! 죄송합니다. 어디에서 왔는지 모르겠습니다. 아니요,이 코드는 Klingon Opera를 읽을 수있게 보이게하며 문서화되어 있습니다. 사실, 나는 그것이 훨씬 덜 문서화되어 있다고 생각합니다 ... 오 세상에.
Jake Kurzer

3
QTMFC 통합? 아 대단하다. 당신은 복잡 하고 사악 해졌 으며, 아직 애플리케이션 특정 코드를 얻지 못했다.
Ben Voigt

5
QT / MFC? 그것이 가장 어리석은 아이디어를 듣는 동안 모든 아이디어를 부르면서 앞뒤로 흔들리는 3 개의 머리를 가진 돌연변이 어린이를 생산해서는 안됩니까? Errr ... I digress ... MFC 소켓 클래스를 사용하는 경우 즉시 소켓 코드를 다시 작성한 다음 프로파일을 작성하십시오. CSocket 코드에는 성능을 저하시키는 것으로 밝혀진 WaitForSingleObject의 메시지 루프 버전을 사용하는 곳이 많이 있습니다. 내 인생에서 나는 기다림 기능의 이름을 기억할 수 없다 ... : /
JimR

2
오 세상에, 당신이 생각하는 것만 큼 엉망입니다.
Jake Kurzer

3
@Jake : 큰 위안은 없지만 튜링 보편성의 영광입니다. 아무리 높거나 낮은 수준의 언어라도 오용 할 수있는 무한한 능력에 해당합니다.
Mike Dunlavey

8

나는 AMD CodeAnalyst로 약간의 성공을 거두었 습니다 .


현재 인텔 환경. 그래도 명심하겠습니다! :)
Jake Kurzer

4
@Jake : 나는 당신이 무슨 뜻인지 잘 모르겠습니다. AMD CodeAnalyst는 AMD 칩이 필요하지 않으며 Intel 칩을 포함한 대부분의 x86 또는 x64 (일명 x86-64 / IA-64 / AMD64) 칩에서 작동해야합니다.
Adam Rosenfield

1
분명히, 나는 문맹입니다! 좋은 소식입니다. 내일 사용해보고 질문을 업데이트하겠습니다.
Jake Kurzer

지금까지 필요한 해상도로 샘플링 할 때 매우 불안정합니다.
Jake Kurzer

@ 아담 : 최근 인텔 펜티엄 IV 컴퓨터에서 코드 분석을 시도했으며 스레드 사용에 대한 정보가 없거나 스레드 관련 정보가없는 시간 기반 샘플링 만 제공했습니다. 부가 내가 :( 만족하지 않았다 .. 비주얼 스튜디오의 QT 통합에 의한 충돌
smerlin

7

MFC OnIdle 기능이 있습니까? 과거에는 PentiumD가 유지할 수 있었던 19.2K 속도로 설정했을 때 직렬 패킷이 떨어지는 문제를 수정해야했습니다. OnIdle 기능은 사물을 죽이는 것입니다. QT에 해당 개념이 있는지 확실하지 않지만 그 사실도 확인합니다.


2
우리는 실제로 OnIdle을 가지고 있으며 QTMFC 통합 덕분에 QT ev..e ... eve ... event 루프를 통해 흐릅니다. 오 G'd.
Jake Kurzer

이 결과는 우리의 솔루션으로 직접 이어 지므로 질문에 대한 완벽한 대답은 아니지만 질문에 대답 할 수 없다고 생각합니다.
Jake Kurzer

4

VS Profiler를 다시 사용하십시오. 큰 파일을 생성하는 경우 샘플링 간격이 너무 자주 있습니까? 어쨌든 충분한 샘플이있을 수 있으므로 낮추어보십시오.

이상적으로는 실제로 문제 영역을 연습 할 때까지 샘플을 수집하지 않아야합니다. 컬렉션이 일시 중지 된 상태에서 시작하여 프로그램이 "느린 활동"을 수행하도록 한 다음 컬렉션을 시작하십시오. 최대 20 초의 수집 만 필요합니다. 이 후 수집을 중지하십시오.

이를 통해 샘플 파일 크기를 줄이고 분석에 필요한 것만 캡처 할 수 있습니다.


내일이 기회를 드리겠습니다.
Jake Kurzer

4

PurifyPlus for Windows를 성공적으로 사용했습니다 . 저렴하지는 않지만 IBM은 약간 구겨진 평가판을 제공합니다. 수량화 로 프로파일 링하는 필요한 것은 pdb 파일과 / FIXED : NO와의 링크입니다. 단점 : Win7 / 64는 지원하지 않습니다.


불행히도, 우리의 주요 목표는 Win7입니다. 이 정보를 기본 게시물에 추가하겠습니다.
Jake Kurzer

1
PurifyPlus의 현재 버전은 Win7 / 64를 지원합니다.
hmuelner

3

이지 프로파일 러 여기에 아직 언급되지 않았으므로 이미 살펴 보았는지 확실하지 않습니다. 메트릭 데이터를 수집하는 방법에는 약간 다른 접근 방식이 필요합니다. 컴파일 타임 프로파일 접근 방식을 사용하는 데 따른 단점은 코드 기반을 변경해야한다는 것입니다. 따라서 느린 위치에 대한 아이디어가 있고 프로파일 링 코드를 삽입해야합니다.

당신이 만드는 적어도 것처럼 최신 의견으로가는 것은 그러나, 그것은 소리가 일부 진전을. 이 도구는 유용한 메트릭을 제공 할 수 있습니다. 다른 것이 없다면 정말 순수한 차트와 그림이 있습니다 : P


3

두 가지 도구 제안.

Luke Stackwalker는 귀여운 이름을 가지고 있습니다 (내 취향에 약간의 노력을 기울이더라도), 비용이 들지 않으며 소스 코드를 얻습니다. 멀티 스레드 프로그램도 지원한다고 주장합니다. 따라서 확실히 가치가 있습니다.

http://lukestackwalker.sourceforge.net/

또한 글로우 코드는 다음과 같이 쓸만한 가치가 있다고 지적했습니다.

http://www.glowcode.com/

불행히도 한동안 PC 작업을 수행하지 않았으므로 이들 중 하나를 시도하지 않았습니다. 어쨌든 제안이 도움이되기를 바랍니다.


3

체크 아웃 XPerf

이것은 MS가 제공하는 무료, 비 침습적 및 확장 가능한 프로파일 러입니다. 그것은 Windows를 프로파일하기 위해 Microsoft에 의해 개발되었습니다.


3

이벤트 루프가 의심스러운 경우 QCoreApplication :: notify () 를 무시하고 수동 프로파일 링을 수행 할 수 있습니까 (보낸 사람 / 이벤트의 한두 개의 맵을 카운트 / 시간으로)?

먼저 이벤트 유형의 빈도를 기록한 다음 해당 이벤트를 더 신중하게 검사합니다 (어떤 오브젝트가 이벤트를 전송하는지, 어떤 것이 포함되어 있는지 등). 스레드 전체의 신호는 암시 적으로 큐에 들어가므로 이벤트 루프에있게됩니다 (명시 적으로 큐에있는 연결도 물론).

이벤트 처리기에서 예외를 포착하고보고하기 위해이 작업을 수행 했으므로 실제로 모든 이벤트가 처리됩니다.

그냥 생각이야


좋은 생각입니다! 나는 지금까지 pyGTK로 대부분의 작업을 수행 한 QT 환경에 익숙하지 않습니다. 감사합니다!
Jake Kurzer

주어진 신호의 특성을 소싱하고 해결하는 권장 방법이 있습니까?
Jake Kurzer

QStateMachine :: SignalEvent가있는 신호에 대해서만 수행했지만 동일하지 않습니다. 소스는 여전히 QObject* object매개 변수 여야합니다 . 어쩌면 MetaCall은 모든 신호의 유형 일 수 있지만 (아마도) 확실하지 않습니다. 이것은 내 경험을 약간 뛰어 넘지 만 Qt 소스를 엿보는 것은 약간의 진실을 모을 수 있습니다. (또는 여기 SO에서 대기중인 신호 호출에 대해 더 뾰족한 질문을하십시오. :)
Macke

2

편집 : 이제 첫 번째 게시물에서 이것을 언급했습니다. 젠장, 난 내가 그 남자가 될 줄은 몰랐어

Pin 을 사용 하면 더 세밀하게 코드를 계측 할 수 있습니다 . Pin은 VTune이나 CodeAnalyst와 같은 것을 거의 모방하여 함수에 몇 번이나 입력했는지 몇 번이나 계산하는지 계산하는 도구를 만들 수 있다고 생각합니다. 그런 다음 타이밍 문제가 사라질 때까지 어떤 기능을 계측 할 것인지 결정할 수 있습니다.


사실, PIN은 내가 처음 도달 한 것입니다. 실제로 완벽한 PIN Play라는 것이 있지만 인텔 이외의 릴리스에는 적합하지 않습니다. PIN을 사용하여 정말 좋은 것을 함께 모으는 것에 대해 충분히 기억하고 있지는 않지만 ...
Jake Kurzer

2

내가 매일 사용하는 것을 말할 수 있습니다.

a) AMD 코드 분석가

  • 쉽고, 무슨 일이 일어나고 있는지에 대한 빠른 개요를 제공합니다. 대부분의 경우 괜찮을 것입니다.
  • AMD CPU를 사용하면 CPU 파이프 라인에 대한 정보를 제공하지만 그래픽 엔진, 비디오 코덱 등과 같이 루프가 많은 경우에만 필요합니다.

b) VTune.

  • vs2008에 매우 잘 통합되어 있습니다.

  • 핫스팟을 알고 나면 시간뿐만 아니라 캐시 미스 및 메모리 사용량과 같은 다른 것들도 샘플링해야합니다. 이것은 매우 중요 합니다. 샘플링 세션을 설정하고 속성을 편집하십시오. 항상 시간, 메모리 읽기 / 쓰기 및 캐시 미스 (세 가지 실행)를 샘플링합니다.

그러나 도구보다 더 많은 프로파일 링 경험이 필요합니다. 그리고 그것은 CPU / 메모리 / PCI가 어떻게 작동하는지 이해한다는 것을 의미합니다. 그래서, 이것은 나의 세번째 옵션입니다

c) 단위 테스트

큰 성능이 필요한 큰 응용 프로그램을 개발하는 경우 매우 중요합니다. 앱을 일부 조각으로 나눌 수 없으면 CPU 사용량을 추적하기가 어렵습니다. 모든 사례와 클래스를 테스트하지는 않지만 중요한 기능을 가진 실행 및 입력 파일을 하드 코딩했습니다.

내 조언은 여러 작은 테스트에서 무작위 샘플링을 사용하고 프로파일 전략을 표준화하려고합니다.


AMD Code Analyst는 개발 환경에서 불안정하며 VTune은 명시 적으로 지원하지 않습니다. : S
Jake Kurzer

2

모든 프로파일 링 요구에 대해 xperf / ETW를 사용합니다. 학습 곡선이 가파르지만 엄청나게 강력합니다. Windows에서 프로파일 링하는 경우 xperf를 알아야합니다. 이 프로파일 러를 자주 사용하여 코드 및 다른 사람들의 코드에서 성능 문제를 찾습니다.

내가 사용하는 구성에서 :

  • xperf는 매 ms마다 코드를 실행하는 모든 코어에서 CPU 샘플을 가져옵니다. 샘플링 속도는 8KHz로 증가 할 수 있으며 샘플에는 사용자 모드 및 커널 코드가 포함됩니다. 이를 통해 스레드가 실행되는 동안 수행중인 작업을 찾을 수 있습니다
  • xperf는 모든 컨텍스트 전환 (각 스레드 사용 시간을 완벽하게 재구성 할 수 있음), 스레드 전환 시점에 대한 호출 스택 및 스레드가 다른 스레드를 준비한 항목에 대한 호출 스택을 기록하여 대기 체인 추적 및 스레드 이유를 찾을 수 있음 실행되지 않습니다
  • xperf는 모든 프로세스의 모든 파일 I / O를 기록합니다
  • xperf는 모든 프로세스의 모든 디스크 I / O를 기록합니다
  • xperf는 활성화 된 창, CPU 주파수, CPU 전원 상태, UI 지연 등을 기록합니다.
  • xperf는 또한 한 프로세스의 모든 힙 할당, 모든 프로세스의 모든 가상 할당 등을 기록 할 수 있습니다.

모든 프로세스에 대한 많은 데이터가 하나의 타임 라인에 있습니다. Windows의 다른 프로파일 러는 그렇게 할 수 없습니다.

xperf / ETW 사용법에 대해 광범위하게 블로그를 작성했습니다. 이 블로그 게시물과 전문적인 품질의 교육 비디오는 여기에서 찾을 수 있습니다. http://randomascii.wordpress.com/2014/08/19/etw-training-videos-available-now/

xperf를 사용하지 않을 때 발생할 수있는 일을 찾으려면 다음 블로그 게시물을 읽으십시오. http://randomascii.wordpress.com/category/investigative-reporting/ 다른 사람들의 코드에서 찾은 성능 문제에 대한 이야기입니다. 개발자가 찾은 것입니다. 여기에는 mshtml.dll이 VC ++ 컴파일러에로드되고, VC ++의 파일 찾기 서비스에 대한 서비스 거부, 놀라운 수의 고객 컴퓨터에서 열 조절, Visual Studio에서 느린 단일 스테핑, 하드에서 4GB 할당이 포함됩니다. 디스크 드라이버, 파워 포인트 성능 버그 등


1

방금 C ++ 용 휴대용 수동 계측 프로파일 링 라이브러리 인 CxxProf 의 첫 번째 사용 가능한 버전을 완료했습니다 .

다음 목표를 달성합니다.

  • 손쉬운 통합
  • 컴파일 시간 동안 lib를 쉽게 제거
  • 런타임 중에 lib를 쉽게 제거
  • 멀티 스레드 응용 프로그램 지원
  • 분산 시스템 지원
  • 최소한의 영향을 유지

이 점은 프로젝트 위키 에서 찢어졌으며 자세한 내용은 그곳을 살펴보십시오.

면책 조항 : 저는 CxxProf의 주요 개발자입니다.


1

본격적인 프로파일 러가 아니더라도 그냥 버릴 수 있습니다. 만약 후에 이벤트 처리에 오랜 시간이 걸리는 이벤트 루프가 걸린 경우, 임시 도구 Qt에서 가 간단합니다. 이 방법은 각 이벤트가 처리하는 데 걸린 시간과 해당 이벤트 등을 추적하기 위해 쉽게 확장 될 수 있습니다. 범용 프로파일 러는 아니지만 이벤트 루프 중심 프로파일 러입니다.

Qt에서는 모든 교차 스레드 신호 슬롯 호출이 타이머, 네트워크 및 직렬 포트 알림 및 모든 사용자 상호 작용과 같이 이벤트 루프를 통해 전달됩니다. 따라서 이벤트 루프를 관찰하는 것은 응용 프로그램이 시간을 소비하는 위치를 이해하기위한 큰 단계입니다.


0

원래 NuMega에서 개발하고 현재 MicroFocus에서 배포 한 DevPartner는 한 번 프로파일 링 및 코드 분석 (예 : 메모리 및 리소스 누수)을위한 솔루션이었습니다. 최근에 시도하지 않았으므로 도움이 될지 확신 할 수 없습니다. 하지만 한 번 훌륭한 결과를 얻었으므로 이것이 코드 품질 프로세스에서 다시 설치하는 것을 고려하는 대안입니다 (14 일 평가판 제공)


0

당신의 OS는 win7이지만, 프로그램은 XP에서 실행할 수 없습니까? xp에서 프로파일을 작성하고 결과는 win7에 대한 힌트가되어야합니다.


확실히, 그것은 가능하지만, 원하는 개발 환경을 제대로 지원하지 못하거나 그렇게하는 데 몇 년이 걸릴 수있는 제품에 대한 라이센스를 구입해야합니다. 1.5k는 베팅하는 데 많은 돈과 xp 상자를 이미징하고 배포하는 데 드는 비용을 더한 금액입니다.
Jake Kurzer

0

여기에 많은 프로파일 러가 나열되어 있으며 몇 가지 직접 시도해 보았습니다. 그러나 나는 이것을 바탕으로 내 자신을 작성했습니다.

http://code.google.com/p/high-performance-cplusplus-profiler/

물론 코드베이스를 수정해야하지만 병목 현상을 좁히는 데 적합합니다. 모든 x86에서 작동해야합니다 (멀티 코어 상자에 문제가있을 수 있습니다 (예 : rdtsc를 사용합니다). 그러나 이것은 순전히 지시 타이밍입니다. -내 필요에 충분하다고 생각합니다.)



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.