2009-04-08 2 views
5

Java 프로그램이 파일의 바이트 수를 읽거나 읽는 데 걸리는 시간을 정확히 계산하는 방법은 무엇입니까?Java 프로그램이 파일을 쓰거나 읽는 데 걸리는 시간을 정확하게 계산하는 방법은 무엇입니까?

시간을 정확하게 측정하는 것이 중요합니다. 시간은 프로그램 자체에서 계산해야합니다.

long startTime = System.nanoTime(); 
doSomething(); 
long elapsedTime = System.nanoTime() - startTime; 

답변

16

표준 관용구는

long delta = System.nanoTime(); 
try { 
    // do your stuff 
} finally { 
    delta = System.nanoTime() - delta; 
} 
+0

startTime을 얻 자마자 스레드가 제어를 잃고 돌아 오는 데 시간이 걸릴 수 있습니다. –

+0

차단되었을 때 디스크에 쓰기를 원하십니까? 막힘을 포함하여 벽 시간에 일반적으로 중요합니다. –

5

테스트 아니지만, 뭔가 같은 :

+0

저는 Java를 처음 사용합니다. final 블록과 결합 된 try 블록을 사용한 이유는 무엇입니까? :) –

+0

try ... finally 블록은 실제 작업 부분에서 예외가 발생하더라도 델타가 계산되도록합니다. 어떤 것이 당신에게 유용 할 수도 있고 그렇지 않을 수도 있습니다. –

+2

나는 캐치를 제안하고 예외를 처리 할 것이다. 작업이 예상대로 완료되지 않으면 시간은 아무런 의미가 없습니다. – uriDium

2

여기에 코드 예제가있다 :

http://www.goldb.org/stopwatchjava.html

/* 
    Copyright (c) 2005, Corey Goldberg 

    StopWatch.java is free software; you can redistribute it and/or modify 
    it under the terms of the GNU General Public License as published by 
    the Free Software Foundation; either version 2 of the License, or 
    (at your option) any later version. 
*/ 


public class StopWatch { 

    private long startTime = 0; 
    private long stopTime = 0; 
    private boolean running = false; 


    public void start() { 
     this.startTime = System.currentTimeMillis(); 
     this.running = true; 
    } 


    public void stop() { 
     this.stopTime = System.currentTimeMillis(); 
     this.running = false; 
    } 


    //elaspsed time in milliseconds 
    public long getElapsedTime() { 
     long elapsed; 
     if (running) { 
      elapsed = (System.currentTimeMillis() - startTime); 
     } 
     else { 
      elapsed = (stopTime - startTime); 
     } 
     return elapsed; 
    } 


    //elaspsed time in seconds 
    public long getElapsedTimeSecs() { 
     long elapsed; 
     if (running) { 
      elapsed = ((System.currentTimeMillis() - startTime)/1000); 
     } 
     else { 
      elapsed = ((stopTime - startTime)/1000); 
     } 
     return elapsed; 
    } 




    //sample usage 
    public static void main(String[] args) { 
     StopWatch s = new StopWatch(); 
     s.start(); 
     //code you want to time goes here 
     s.stop(); 
     System.out.println("elapsed time in milliseconds: " + s.getElapsedTime()); 
    } 
} 
2

방법 나는 루프를 몇 번 반복해서 실행하는 것입니다. 당신이 그것을 1000 번 실행하고 시계한다면, 그것은 당신에게 밀리 초를줍니다. 1,000,000 번 실행하면 마이크로 초가됩니다.

왜 오래 걸리는지 알아 보려면 실행 중일 때 (10과 같이) 몇 번만 멈추고 그 일과 이유를 알려줍니다.

1

get System.xxx 메서드의 문제는 메서드 자체가 계산하는 데 몇 밀리 초가 필요하다는 것입니다. 일반적으로 "받아 들인"방법은 수만 번 테스트를 실행하고이 평균을 계산하는 것입니다.

또한 OS에 따라 time granularity (예 : Windows 용)이 있습니다. 이것은 OS가 계산할 수있는 가장 작은 시간입니다. 일부 OS에서는 밀리 초, 다른 일부에서는 나노초입니다. 그것은 귀하의 경우에 관련이있을 수도 있고 그렇지 않을 수도 있습니다.

+0

System.nanoTime()은 0.5 마이크로 초가 소요되며 System.currentTimeMillis()는 훨씬 적습니다. –