2012-02-17 2 views
0

설명 할 수없는 한 가지 문제점이 있습니다. 이 필요한 경우Java에서 메소드 실행의 실제 시간은 무엇이며 어떤 영향을 받습니까?

String numberStr = "3151312423412354315"; 

System.out.println(numberStr + "\n"); 
System.out.println("Lehman method: "); 
long beginTime = System.currentTimeMillis(); 
System.out.println(Lehman.getFullFactorization(numberStr)); 
long finishTime = System.currentTimeMillis(); 
System.out.println((finishTime-beginTime)/1000. + " sec."); 

System.out.println(); 

System.out.println("Lehman method: "); 
beginTime = System.currentTimeMillis(); 
System.out.println(Lehman.getFullFactorization(numberStr)); 
finishTime = System.currentTimeMillis(); 
System.out.println((finishTime-beginTime)/1000. + " sec."); 

: 다음은 주요 기능의 코드는 문자열 형식의 주요 약수의 ArrayList을 반환 Lehman.getFullFactorization(...) 방법.

3151312423412354315 

Lehman method: 
[5, 67, 24473, 384378815693] 
0.149 sec. 

Lehman method: 
[5, 67, 24473, 384378815693] 
0.016 sec. 

는 내가 놀랐습니다, 나는 그것을 보았다 : 여기

이 출력됩니다. 같은 방법으로 두 번째 실행이 첫 번째보다 훨씬 빠른 이유는 무엇입니까? 첫째, 메소드 실행의 첫 번째 단계에서는 JVM과 해당 자원을 실행하는 시간이 계산되지만, "주"메소드를 실행하기 전에 JVM이 시작되기 때문에 불가능하다고 생각했습니다.

+0

그 같은? 내 말은, 초는 항상 빠르다는거야? – sgowd

+0

알렉산더, 모든 사용자가 읽을 수 있도록 이름을 변경하십시오. 모두가 키릴 문자를 읽을 수있는 것은 아닙니다.) –

답변

1

10,000 번 이상 시도하면 속도가 훨씬 빨라집니다. 이 코드가 처음로드되어야하기 때문에 (비용)를 해석 모드 (확인 속도)에서 실행되며 마지막으로 (더 빨리)

이 시도 할 수 네이티브 코드로 컴파일된다? 항상

int runs = 100*1000; 
for(int i = -20000 /* warmup */; i < runs; i++) { 
    if(i == 0) 
     beginTime = System.nanoTime(); 
    Lehman.getFullFactorization(numberStr); 
} 
finishTime = System.nanoTime(); 
System.out.println("Average time was " + (finishTime-beginTime)/1e9/runs. + " sec."); 
0

JVM이 첫 번째 계산의 결과를 캐싱 한 것으로 가정하고 더 빠른 두 번째 계산을 관찰합니다. 행동하는 JIT. 어떤 경우

0

두 번째 실행 속도를 높이는 데는 두 가지가 있습니다.

  1. 처음으로 메서드를 포함하는 클래스를로드해야합니다. 두 번째로, 그것은 이미 기억 속에있다.
  2. 가장 중요한 것은 JIT가 자주 실행되는 코드를 최적화한다는 것입니다. 첫 번째 호출 중에 JVM은 바이트 코드를 해석하여 시작한 다음이를 머신 코드로 컴파일하고 실행을 계속합니다. 두 번째로, 코드는 이미 컴파일되어 있습니다.

Java의 마이크로 벤치 마크는 종종 검증하기가 어렵습니다.

0

내 생각에 최적화를 위해 CPU의 L1/L2 캐시에 저장됩니다.

Java는 다시 해석 할 필요가 없으며 메모리에서 이미 컴파일 된 코드로 다시 호출합니다.

관련 문제