2014-04-10 3 views
0

DDMS 프로파일 러가 원시 메소드 호출을 프로파일 링하지 않는다는 것을 알고 있으며, 원시 코드를 프로파일 링하는 데 다양한 메소드를 사용할 수 있다는 것을 알고 있습니다. 그러나 실제로 알고 자하는 것은 원시 코드와 Java 코드의 비율입니다.DDMS 프로파일 러에서 원시 코드는 어떻게 생겼습니까?

특히 DDMS 메소드 프로파일 링은 원시 메소드가 호출 될 때 무엇을합니까? 시간이 아직 기록 되나요, 그렇지 않은가요? 문제의 앱은 길고 차단 된 네이티브 호출을 가지고 있지만 시각적 추적 뷰어에서 (Java 코드에서 볼 수있는 견고한 블록과는 대조적으로) 118ms 만 사용하고 긴 "밑줄"로 표시됩니다. 네이티브 코드에 소요 된 시간이 프로파일의 함수의 전체 시간에 추가되지 않는다고 추측하는 것이 맞습니까?

답변

1

Dalvik method profiler은 모든 메소드 호출에 대해 두 개의 시간 소인을 기록합니다. 하나는 CLOCK_THREAD_CPUTIME_ID 타이머에서 나오고, 다른 하나는 벽시계 시간 (gettimeofday())입니다. 전자는 스레드가 코드를 실행하는 데 소비 한 시간을 대략적으로 측정합니다.

스레드가 잠자기 (예 : 뮤텍스에서 차단)되었지만 실행 중에 진행되거나 디스크 I/O가 완료 될 때까지 대기하는 (IIRC) 스레드 cputime 시계가 진행되지 않습니다. 원래 프로파일 링 코드는 방금 스레드 cputime을 기록했습니다. 벽 시계 시간이 다시 믹스에 추가되어 메소드가 실제로 실행 된 시간과 얼마나 바쁜지를 확인할 수있었습니다.

관리되는 코드와 기본 코드 모두에 대해 메서드를 입력 할 때와 반환 할 때 항목이 만들어집니다. 그 점에서 진정한 차이는 없습니다.

+0

특히 프로파일 러에 대한 링크를 이용해 주셔서 감사합니다. 매우 유익한. 그러나 DDMS가 분명히 오랜 시간이 걸릴 때만 몇 밀리 초 밖에 걸리지 않는 네이티브 함수 호출을 표시하는 이유는 훨씬 더 혼란 스럽습니다. Android 2.3.3에서 프로파일 링한다는 사실이 효과가 있습니까? –

+0

예 - 프로파일 러가 Android 4.0까지 벽시계 기록을 시작하지 않았습니다. 그 전에는 스레드 당 누적 CPU 시간 만있었습니다. 따라서 네이티브 메소드가 2 초 동안 차단 된 후 100ms의 작업을 수행했다면 프로파일에는 100ms의 시간 만 표시됩니다. (이것이 두 번째 타임 스탬프가 추가 된 이유입니다.) – fadden

관련 문제