2016-10-02 5 views
1

jvisualvm을 사용하여 relativly 간단한 자바 프로그램을 프로파일 링하려고했습니다. 결과는 다소 이상합니다. 작은 4 줄 방법은 다른 방법보다 훨씬 많은 자체 시간을가집니다!이상한 프로파일 러 결과

public class Hub 
    public void clock() { 
     for (int i = 0; i < cogs.length; i++) { 
      cogs[i].clock(cnt, i, this); 
     } 
     cnt++; 
    } 
} 

참고 :이 경우 cgs.length는 8입니다.

Cog.clock 메서드가 상당히 큽니다. 이상합니다.

public class Cog 
    public void clock(int cnt, int cogid, Hub hub) { 
     if (state == State.STOP) 
      return; 
     //long code goes here 
    } 
} 

그러나 shouldn ': 내가 가지고 올 수있는 유일한 그럴듯한 설명은 (이 경우 8 6) 대부분의 코그 객체가 같은 사로 잡았하는 "정지"상태에있을 것이라는 사실이다 큰 영향을줍니다! 여기에 증거 사진입니다 :

enter image description here

+0

'clock()'을 몇 번이나 호출하고 있습니까? 나머지 코드는 어디에 있습니까? –

+0

Hub.clock과 Cog.clock의 차이를 명확히하기 위해 편집했습니다. 기본적으로 Hub.clock은 무한 루프에서 호출되며 모든 Cog 객체에서 시계를 호출합니다. –

+0

나는 프로파일 러를 많이 신뢰하지 않을 것이다. 측정은 실행에 영향을 주며 많은 문제가 있습니다. 총 런타임이 실제로 10ms이면,이를 잊어 버릴 수 있습니다. JVM은 모든 것을 제대로 최적화하기 위해 더 많은 것을 필요로합니다. 속도 문제에 직면하지 않으면 무시할 수 있습니다. (제가 여기에 정확히 무엇이 될지 궁금합니다.) 그렇지 않은 경우 더 긴 측정을 수행하고 결과를 게시하십시오. – maaartinus

답변

0

프로파일 링 코드 때문에이 악기 (수정) 그것의 실행 시간에 영향을 미친다. 9000 ms에서 실행되는 호출은 12000_000이고, 호출 당 약 750 나노초이며, 이는 계기가 속도를 느리게 만들었 기 때문에 계측 없이는 더 적을 것입니다. 호출 당 그러한 시간에 저는 프로파일 러에서 합당한 것을 기대하지 않을 것이고 다른 메소드에 대한 결과를 비교하지 않을 것입니다. 더 많은 호출을 가진 메소드가 더 적은 호출보다 더 높은 점수를 얻게 될 것입니다 (대부분 사용자의 Cog.clock 호출 상태 및 종료 만 확인). VisualVM 샘플러를 사용해 볼 수도 있지만 충분히 정확하지는 않습니다. 너 자신을 시간 측정하려고 시도 할 수도 있지만 (심지어 System.nanoTime()), 심지어 마이크로 초 미만의 정확도를 보장하지는 않습니다.