몇 달 전에 도스로 실행하는 프로파일 러를 작성했습니다.
당신이 KCacheGrind를 사용한다면 여기에 내가 할 일이 있습니다. 그것을 쓰는 것은 그리 어렵지 않을 수도 있고 아니면 직접 손으로 할 수도 있습니다.
KCacheGrind에는 임의 시간에 수동으로 덤프를 트리거 할 수있는 도구 모음 버튼 "강제 덤프"가 있습니다. 프로그램을 기다리는 동안 무작위 또는 의사 임의의 시간에 스택 추적을 캡처하는 것이 기술의 핵심입니다.
많은 샘플이 필요하지 않습니다. 일반적으로 20 개가 충분합니다. 50 % 이상의 병목 현상으로 인해 많은 비용이 소요되는 경우 5 개의 샘플로 충분할 수 있습니다.
샘플 처리는 매우 간단합니다. 각 스택 추적은 일련의 코드 행 (실제 주소)으로 구성됩니다. 마지막 행을 제외한 모든 행은 함수/메소드 호출입니다.
샘플에 나타나는 모든 코드 줄 목록을 수집하고 중복을 제거하십시오.
각 코드 행에 대해 표시되는 샘플의 비율을 계산하십시오. 예를 들어 20 개의 샘플을 가져 와서 그 중 3 개에 코드 줄이 나타나면 재귀 때문에 일부 샘플에 두 번 이상 표시 되더라도 카운트는 3/20 또는 15 %입니다. 이는 각 진술의 비용을 직접 측정 한 것입니다.
가장 값 비싼 100 줄 정도의 코드 줄을 표시하십시오. 귀하의 병목 현상이 해당 목록에 있습니다.
은 내가 일반적으로이 정보를 어떻게하면 수동으로 자신이 나타날 때까지 스택 샘플을 채취 (또는 이미 가지고 사람을보고)하고 질문 한 후 높은 비용으로 라인을 선택하고있다 "왜 이는 로컬 감각뿐만 아니라 글로벌 감각으로 코드 라인을 수행합니다. " 이를 표현하는 또 다른 방법은 "샘플을 취할 때 시간 조각에서 성취하려고하는 프로그램이 세계적인 의미에서 무엇인가"입니다. 제가이 질문을하는 이유는 그 라인이 비용을 지출하는 것이 정말로 필요한지를 알려주기 때문입니다.
나는 프로파일을 개발 않는 모든 위대한 직장 사람들의 중요하고 싶지 않아,하지만 슬프게도 확고하게 입지를 굳힌 신화가 많이 포함하여, 주제에있다 :와,
그 정확한 측정 많은 샘플이 중요합니다. 오히려 강조가 에 있어야 병목 현상이입니다. 정확한 측정은 그 전제 조건은 아닙니다. 10 %에서 90 % 사이의 비용이 소요되는 일반적인 병목 현상의 경우 측정이 매우 거칠 수 있습니다.
이 코드 줄 이상의 기능을합니다. 값 비싼 함수를 찾으면 병목 현상이있는 행을 검색해야합니다. 그 정보는 스택 트레이스에서 바로 찾을 수 있습니다. 사냥 할 필요가 없습니다.
벽 시계 시간과 CPU를 구별해야합니다. 당신이 그것을 기다리고 있다면, 그것은 벽시계 시간 (손목 시계 시간?)입니다. 불필요한 I/O로 구성된 병목 현상이있는 경우 CPU 시간이 아니기 때문에이를 무시하고 싶습니까?
은 배타적 시간과 포괄 시간의 구분이 유용하다는 것을 나타냅니다. 시간 함수가 아니라면 피 호출자가 아닌 시간을 보냈는지 알기 쉽습니다. 코드 줄을 살펴보면 중요한 것은 포괄적 인 시간뿐입니다. 또 다른 방법은 모든 명령어가 마이크로 코드 만 호출하는 경우에도 호출 명령어입니다.
재귀가 중요합니다. 그것은 라인이있는 샘플의 분율에 영향을 미치지 않으며 책임이 있기 때문에 무의미합니다.
줄 또는 함수의 호출 수가 중요합니다. 속도가 빠르거나 너무 많이 호출되거나 속도가 느리고 한 번 호출되는 경우 비용은 사용되는 시간의 백분율이며 스택 샘플이 추정합니다.
샘플링 성능이 중요합니다. 병목 현상을 일으키지 않는다고 가정하고 계속 진행하기 전에 스택 샘플을 가져 와서 몇 분간 보면서 상관 없습니다.
Here's 더 완전한 설명.