2012-03-15 5 views
0

프로그래밍 언어로 시계 시간에 문제가있는 것은 이번이 처음이 아닙니다. 기본적으로 필자는 while 루프에서 함수를 호출하여 함수의 실행 속도를 측정하고 있습니다. 문제는 어떤 이유로 루프가 돌아가는 데 걸리는 시간이 길어질수록 경과 시간이 짧아지는 것입니다. 아무도 설명 할 수 있을까요? 아래 코드.Java System.nanoTime 경과 평균 시간이 점점 작아짐

DescriptiveStatistics stats = new DescriptiveStatistics(); 
while(true) { 
    long startTime = System.nanoTime(); 
    executeSaxonXsltTransformation(); 
    long stopTime = System.nanoTime(); 
    long elapsedTime = stopTime-startTime; 
    stats.addValue((double)elapsedTime); 
    System.out.println(stats.getN()+" - "+elapsedTime+ " - "+stats.getMean()); 
} 

따라서 약 1,000 회 실행 한 후 경과 시간은 750k - 850k입니다. 그러나 약 100,000 회 실행 한 후 경과 시간은 580k에서 750k로 떨어집니다. 연속 감소는 평균 (stats.getMeans())을 관찰하면 가장 잘 나타납니다.이 통계는 108k 루프가 평균 ~ 632k인데 비해 3k 루프는 평균 1 백만입니다. nanoTime 대신 currentTimeMillis로 전환해도 아무런 변화가 없습니다.

답변

4

Java의 JIT는 광범위하게 실행되는 코드를 최적화하기 때문에 완전히 발생한다고 가정합니다. 실행이 많을수록 JIT가 최적화에 더 많은 노력을 기울입니다.

벤치 마크를 시도하는 경우 타이밍없이 몇 초 동안 방법을 실행하여 벤치 마크를 "워밍업"하고 타이밍을 시작해야합니다. Java에서 일관된 벤치마킹을 수행하는 방법을 알고있는 라이브러리를 사용할 수도 있습니다. 예를 들어 JIT를 워밍업하고 메소드에 나노초 또는 초가 걸리는 지 정확하게 측정하려면 Caliper을 사용할 수 있습니다.

+0

감사합니다. 나는 이런 일이 일어나고 있다고 느꼈다. – Thirlan

+0

Caliper는 요즘과 같이 일관된 벤치마킹 방법을 알고 있습니까? 필자가 마지막으로봤을 때, PrintCompilation의 결과는 매우 고무적이지 않았습니다. – kittylyst

+0

캘리퍼스는 마이크로 벤치마킹이 매우 좋습니다. 나는 "매크로"벤치 마크에서 어떻게 작동하는지 알지 못한다는 것을 인정하지만, 작고 단단한 방법을 측정하기 위해서는 탁월합니다. –

7

문제는 while 루프가 실행될 때까지 경과 시간이 짧아지는 문제입니다. 아무도 설명 할 수 있을까요?

핫스팟입니다. 코드를 실행할수록 더 적극적으로 최적화됩니다. 결국 그것은 할 수있는 모든 일을하게 될 것이고 결과에 고원이 보일 것입니다.

+0

이 질문을 클릭하기 전에도 "OP가 10k 반복에서 점프하는 것을 볼 것"이라고 나 자신에게 말했다. 이것이 서버 모드에서의 컴파일에 대한 기본 임계 값입니다. [동적 컴파일] (http://www.ibm.com/developerworks/library/j-jtp12214/)의이 페이지를 참조하십시오. – yshavit