2014-10-07 1 views
0

루프의 실행 시간을 측정하려고합니다. 이는 간단한 행렬 추가입니다. 때로는 예를 m로 I 입력 1000 N에 대해 0을 반환getCurrentThreadUserTime()을 사용하여 실행 시간 가져 오기

 //get integers m and n from user before this. 
     long start,end,time; 
     int[][] a = new int[m][n]; 
     int[][] b = new int[m][n]; 
     int[][] c= new int[m][n]; 

     start = getUserTime(); 

     for(int i = 0;i < m;i++) 
     { 
      for(int j = 0;j < n;j++) 
      { 
       c[i][j] = a[i][j]+b[i][j]; 
      } 
     } 
     end = getUserTime(); 

     time = end - start; 


     /** Get user time in nanoseconds. */ 
     public long getUserTime() { 
      ThreadMXBean bean = ManagementFactory.getThreadMXBean(); 
      return bean.isCurrentThreadCpuTimeSupported() ? 
      bean.getCurrentThreadUserTime() : 0L; 
     } 

문제가 : 여기 내 코드입니다. 즉 두 개의 1000x1000 행렬이 추가됩니다. 때로는 0과 때로는 15ms를 반환합니다 (둘 다 계속 반복됩니다).

나는 15ms 또는 0. 믿을 지 모르겠다. 그들 사이에 큰 차이가있다. 정확도는 OS 의존적이며 정확한 나노초는 아니지만 15 밀리 초는 정확도 문제가 될 수 있습니다.

편집 :이 코드의 목적은 루프의 CPU 성능을 측정하는 것이 었습니다. 가능하다면 컴파일러 최적화와 OS 컨텍스트 전환 등의 영향을 최소화하고 싶습니다.

많은 감사.

+0

이 어떻게 자바에서 나노 초 단위로 현재 시간을 얻을 수 있나요? 가능한지 확실하지 않습니다 ... – Alboz

+0

밀리 초 단위로 시간을 확인해 주시겠습니까? – Alboz

+0

OS의 정확도 (xp 사용)로 인해 나노초로 얻을 수는 없지만 15 밀리 초의 차이만으로는 올바르게 보이지 않습니다. 또한 위의 벤치마킹에 대한 자세한 설명은 다음과 같습니다. http://nadeausoftware.com/articles/2008/03/java_tip_how_get_cpu_and_user_time_benchmarking – Ramin

답변

3

System.nanoTime()을 사용해야합니다. 문서에서 (API Here)

는 :

이 방법은 시간의 경과를 측정하는데 사용되는 시스템 또는 벽시계 시간의 다른 개념에 관련된 없다 할 수있다. 값은 일부 고정되었지만 임의적 인 원점 이후 시간을 나타냅니다 (이후에는 값이 음수 일 수 있습니다). 동일한 오리진은 Java 가상 시스템의 인스턴스에서이 메소드를 호출 할 때마다 사용됩니다. 다른 가상 머신 인스턴스는 다른 원점을 사용합니다.

그래서 nanoTime()은 측정이 항상 같고 나노초를 사용하므로 실행 시간을 측정하는 데 적합합니다.

시작 시간을 현재 나노 시간으로 설정하십시오. 루프의 끝에서

start = System.nanoTime(); 

은 당신이처럼 단지 빼기, 실행하는 데 걸린 시간의 차이를 찾으려면 현재 나노 시간

end = System.nanoTime(); 

에 종료 시간을 설정합니다.

는 쉽게, 그냥 돌아 getUserTime()을 변경할 수 있도록하려면 System.nano()

예 :

//get integers m and n from user before this. 
long start,end,time; 
int[][] a = new int[m][n]; 
int[][] b = new int[m][n]; 
int[][] c= new int[m][n]; 

start = getUserTime(); 

for(int i = 0;i < m;i++) 
{ 
    for(int j = 0;j < n;j++) 
    { 
     c[i][j] = a[i][j]+b[i][j]; 
    } 
} 
end = getUserTime(); 

// You could use Math.abs() here to handle the situation where 
// the values could be negative 
time = end - start; 

/** Get user time in nanoseconds. */ 
public long getUserTime() { 
    return System.nanoTime() 
} 
+0

잘못되었습니다 ... System.nanoTime()이 정확성을 보장하지 않습니다 ... 현재 시간을 알려주지 않습니다. – Alboz

+1

OP에는 현재 시간이 필요하지 않으며 프로그램 실행에 걸리는 시간이 필요합니다. 'System.nanoTime()'은 매우 적합합니다. JVM의 고해상도 시간 원본을 사용합니다. – mdewitt

+0

반환 된 값은 일부 고정되었지만 임의의 원래 시간 이후의 나노초를 나타냅니다 (미래에는 값이 음수 일 수 있습니다). – Alboz