2009-07-07 4 views
5

필자는 Yourkit 8.0을 사용하여 Mac OS X (10.5.7, Apple JDK 1.6.0_06-b06-57)에서 실행되는 수학 집중 애플리케이션을 프로파일 링했으며, 이상한 점을 발견했습니다 CPU 프로파일 링 결과의 동작자바 이상한 결과로 네이티브 메소드 프로파일하기

예를 들어, 필자는 샘플링을 사용하여 프로파일 링을 실행했는데, 이는 응용 프로그램의 10 분 런타임의 40 %가 StrictMath.atan 메서드에서 사용 된 것으로보고했습니다. 나는이 수수께끼를 발견했지만, 나는 그것을 말로 표현하고 atan을 극히 간단하게 다항식으로 바꾸는 데 약간의 시간을 보냈다.

응용 프로그램을 다시 실행하면 이전과 거의 동일한 시간 (10 분)이 걸렸지 만 atan 대체 프로그램은 프로파일 링 결과에 아무데도 나타나지 않습니다. 대신, 다른 주요 핫스팟의 런타임 퍼센티지는 단순히 그것을 보충하기 위해 증가했습니다.

는 요약하자면

결과를 StrictMath.atan (원시 메소드)
총 런타임 함께 10 분
방법 1 : 20 %
방법 2 : 20 %
방법 3 : 20 %
StrictMath.atan : 40 %
총 런타임 ATAN 단순화, 순수 자바

결과 : 10 MINU TES
방법 1 : 33 %는
방법 2 : 33 %
방법 3 :

는 (방법 1,2,3 어떤 ATAN 호출을 수행하지 않음)

은 어떤 생각이 무엇 33 %입니다 이 행동으로? EJ-Technologies의 JProfiler를 사용하여 동일한 결과를 얻었습니다. JDK 프로파일 링 API가 원시 메소드에 대해 OS X에서 부정확 한 결과를보고하는 것처럼 보입니다.

+0

'atan'이 내장되어 있으면 놀라지 않을 것입니다. 메소드를 호출하는 대신 해당 기계 코드가 인라인으로 주입됩니다. –

+0

Mac OS X 10.7의 StrictMath (및 이전 버전도 마찬가지 임)에서 다양한 방법으로이 기능을 경험했습니다. –

+0

그래서이 문제에 대한 해결책이 있습니까? – ziggystar

답변

3

이것은 샘플을 가져올 때의 불일치로 인해 발생할 수 있습니다. 예를 들어, 메소드가 상당한 시간을 사용하지만 실행하는 데 시간이 오래 걸리지 않으면, 샘플링에서이를 놓칠 수 있습니다. 또한 샘플에서는 가비지 수집이 발생하지 않는다고 생각하지만 일부 코드가 가비지 수집을 많이 발생 시키면 샘플에 나타나지 않고 속도 저하에 크게 기여할 수 있습니다.

이와 비슷한 상황에서 샘플링을 사용하면 한 번만 추적하면 한 번 두 번 실행하는 것이 좋습니다. 두 방법 모두에 메서드가 표시되면 CPU가 많이 사용됩니다. 그렇지 않으면 샘플링 프로세스의 결과물 일 수 있습니다.

0

YourKit은 하위 메서드 호출 비용을 크게 과장했습니다 (해당 로깅 메서드로 인해). 프로파일이 제공하는 조언을 따르는 경우 HotSpot이 일반적으로 잘 수행 할 수 있기 때문에 기능을 병합하는 것만으로 끝납니다.

따라서 프로파일러 외부의 배치를 완전히 테스트하여 변경 사항이 실제로 도움이되는지 여부를 확인하는 것이 좋습니다 (명백한 것처럼 보일 수 있지만 개발 시간이 다소 소요될 수 있음).

0

Mac을 사용하고 있기 때문에 Java를 지원하는 Apple's Shark profiler (ADC에서 무료 다운로드)을 시도해 볼 수 있습니다. Apple의 성능 그룹은 도구에 상당한 시간을 투자했습니다.

Nick이 지적했듯이 샘플 간격이 함수 실행 시간에 충분히 가깝고 함수가 실제로 실행될 때 프로파일 러가 거의 확인하지 않으면 샘플링이 오도 될 수 있습니다. YourKit이 이것을 지원하는지 여부는 모르겠지만 Shark에서는 샘플링 간격을 기본 10ms가 아닌 다른 것으로 변경하고 그 결과가 실질적으로 다른지 확인할 수 있습니다. 또한 모든 기능 입력/복귀를 기록하는 별도의 통화 추적 모드가 있습니다.이 기능은 별칭 오류의 가능성을 완전히 피할 수 있지만 많은 양의 데이터와 더 높은 오버 헤드를 수집합니다. 앱이 실시간 처리.

0

세 가지 방법으로 전달되는 매개 변수를 살펴볼 수 있습니다. 반환 값을 생성하는 데 시간이 소비되거나 많은 수의 임시 객체를 만드는 메소드에서 시간이 소요될 수 있습니다.

-1

프로필러가 이와 같을 수 있습니다.

This is the method I use.

모든 시간을 작동합니다.

And this is why.

+0

이것이 왜이 프로세스를 자동화하는 샘플링 프로파일 러의 결과와 다른 결과를 초래하는지 설명하고 싶습니까? – ziggystar

+0

@ziggystar : 일부 샘플링 프로파일 러는 프로세스의 절반, 즉 전체 스택을 샘플링하는 프로세스를 벽 시계 (CPU가 아닌) 시간에 자동화합니다. 자동화하지 않는 프로세스의 절반은 해결할 수있는 성능 문제의 발견입니다. 문이나 함수가 작은 값을 포함하면 문제는 다른 곳에서 발생하지만 문제가 많은 곳에서는 좁혀지지 않습니다. 단순히 코드, 기능 또는 "경로"가 "뜨겁다"는 것을 아는 것만으로는 많은 것을 알 수 없습니다. 특정 대표 샘플을 전체적으로 검토 할 수 있다면 더 많은 것을 알 수 있습니다. ... –

+0

@ziggystar : ... 이것은 다른 결과로 이어집니다. 아주 좋은 프로파일 러로도 찾을 수없는 속도 향상을 찾을 수 있습니다. 프로그램을 수정하고 프로세스를 반복 할 때 프로그램이 더 적은 시간이 걸리기 때문에 작은 문제는 이제 더 큰 %입니다. 그래서, 하나 하나, 당신은 이것들을 고치고 복합 속도 향상은 놀랄 수 있습니다. 프로파일 작성기로 얼마나 빨라 졌습니까? 대답이 40 % 이상이면 놀라게 될 것입니다. –

0

그것은 그들이 충분히 작은 경우 Java 메소드 그러나 기본 방법은 다른 규정에 따라 인라인, 인라인 될 수 있음을 주목할 필요. 메소드가 인라인 된 경우 프로파일 러에 표시되지 않습니다. (어쨌든 YourKit은 아닐 것입니다)