2013-01-05 3 views
0

Java에서 함수의 실행 시간을 가져와야합니다. 나는 내가 사용할 수있는 두 가지 방법을 알고있다. currentTimeMillis();nanoTime(); 그러나 나는 벽시계가 필요하다면 currentTimeMillis();이 더 정확하다는 것을 배웠다. 처리 시간이 아님).currentTimeMillis() 메서드를 사용하여 작은 분수로 실행 시간을 얻는 방법

그러나 currentTimeMillis();은 작은 분수를 부여 할 수 없습니다. 예를 들어, 실행 시간이 1 밀리 초 미만이면 0을 반환합니다. 1보다 작 으면 0.05 밀리 초가 필요합니다. 방법은이 시간을 반환하더라도 0

long startTime=System.currentTimeMillis(); 
for(int x=0; x<10;x++) 
{ 
    System.out.println("-"); 
} 

long execTime=System.currentTimeMillis() - startTime; 

을 반환 할 때이 간단한 예입니다, 내가 좀 더 정확한 수, 말, 30.00012이 필요, 30 또는 40로 반환하지만. 또한 메서드 반환 유형은 long이지만 부동 소수점 숫자를 원할 때 double으로 변경했습니다.이 문제가 있습니까? currentTimeMillis()과 : 당신이 내 자바 메소드 실행 벽 시계 (예를 들어하지 8.0하지만 8.287335) 작은 부분 번호 시간

+1

프로필러 사용에 대해 생각해 보셨습니까? –

+1

"하지만 부동 소수점 숫자를 원하면 'double'로 변경했습니다.이 문제가 있습니까?" 돌려 주어지는 밀리 세컨드 또는 나노초의 수가 「2^53」보다 큰 경우는 반올림 효과를 얻을 수 있습니다 만, 타이머가 정수 치를 돌려주기 때문에 대부분은 단지 무의미합니다. –

답변

0

코드 블록에 대해 가장 정확한 사용 가능한 실행 시간을 얻으려면 nanoTime을 사용할 수 있지만 사용해야합니다. 그러나 실행 시간에 영향을 줄 수있는 많은 외부 문제가 있으므로주의해서 사용해야합니다.

예를 들어 최근에 실행하지 않고 메소드를 호출하면 캐시로 가져 오는 오버 헤드가 발생합니다. 같은 페이지에있는 내용에 따라 메모리에 읽어 들이기 위해 디스크를 읽을 수도 있습니다.

JVM은 여러 번 실행하는 것과 비교하여 한 번 실행되는 경우에만 다르게 처리 할 수 ​​있습니다.

일반적으로 측정하는 것이 작업 또는 트랜잭션에서 여러 번 실행되기 때문에 마이크로 초를 신경 쓰면됩니다. 정확한 측정을 위해서는 많은 호출을 통해 측정해야합니다. 그렇게하면 nanoTime을 호출하는 오버 헤드 시간의 영향을 줄일 수 있습니다.

6

을 측정 할 수있는 적절한 방법을 말해 줄 수 나는 두 가지 방법을 알고 사용할 수 있어요 nanoTime(). 그러나 벽시계가 필요한 경우 currentTimeMillis()이 더 정확하다는 것을 알게되었습니다. 즉, 벽시계에서 측정 한 것처럼 실행이 얼마나 많은 시간이 걸렸는지를 알게되었습니다. 처리 시간이 아닙니다.

그건 부분적으로 정확합니다.

두 함수 모두 CPU 시간이 아닌 월 클럭 시간을 반환합니다.

정밀도 이외의 차이는 currentTimeMillis()이 잘 알려진 시점과 관련이있는 반면, nanoTime()은 임의의 특정 시점을 기준으로 한 것입니다. 즉, nanoTime()의 결과를 사용자와 내가 이해할 수있는 타임 스탬프로 쉽게 변환 할 수 없음을 의미합니다.

벽 시계 간격을 측정하는 데 여전히 사용할 수 있습니다. nanoTime()을 두 번 호출하고 차이를 가져옵니다. 그것은 꽤 많이 설계된 것입니다.

마지막으로, 코드를 프로파일 링하기 위해 이것을 사용하는 경우 How do I write a correct micro-benchmark in Java?을 읽으십시오. 많은 미묘함이 있습니다.

+0

다음을 확인할 수 있습니다. http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/System.html#nanoTime%28%29. 그들은 다음과 같이 말합니다. '시스템이나 벽시계의 다른 개념과는 관련이 없습니다.' 내가 뭔가를 오해하고 있니? –

+2

@WiliamA 귀하가 언급 한 문서는 "경과 된 시간 만 측정 할 수 있습니다"라고 말합니다. 경과 시간을 측정하려고 했으므로 아무런 문제가 없습니다. 문제는 nanoTime 결과가 날짜와 관련이 없다는 것입니다. 수요일에 장시간 작업을 시작하고 목요일에 다른 작업을 시작하면 수요일 작업의 nanoTime 호출은 목요일 작업에서 나중에 발생하는 nanoTime 호출보다 큰 결과를 가져올 수 있습니다. –

+1

@WiliamA : 혼란은 전문 용어라고 생각합니다. 'nanoTime()'의 경과 된 초수는 너와 같은 순간이다. 정의되지 않은 것은'nanoTime()'이 계산을 시작하는 * origin *입니다. 여전히 두 개의'nanoTime()'값을 빼고 의미있는 결과를 얻을 수 있습니다. – NPE

1

System.nanoTime() 나노초의 정밀도를 사용하십시오.

관련 문제