[java] 자바에 스톱워치가 있습니까?

자바에 스톱워치가 있습니까? Google에서는 작동하지 않는 스톱워치 코드 만 찾습니다. 항상 0 밀리 초를 반환합니다.

내가 찾은이 코드는 작동하지 않지만 이유를 모르겠습니다.

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;
  }
}



답변

당신은에서 하나를 찾을 수 있습니다

http://commons.apache.org/lang/

그것은 ~라고 불린다

org.apache.commons.lang.time.StopWatch

그러나 대략 당신과 동일합니다. 더 정밀한 경우 다음을 사용하십시오.

System.nanoTime()

여기에서이 질문을 참조하십시오.

자바에서 오버 헤드를 측정하는 시간


답변

Guava의 Stopwatch클래스를 사용하십시오 .

경과 시간을 나노초 단위로 측정하는 객체입니다. 다음 System.nanoTime()과 같은 몇 가지 이유로 직접 호출 대신이 클래스를 사용하여 경과 시간을 측정하는 것이 유용합니다
.

  • 테스트 또는 성능상의 이유로 대체 시간 원본을 대체 할 수 있습니다.
  • nanoTime에서 문서화 한대로 반환 된 값은 절대적인 의미가 없으며 다른 시간에 nanoTime에서 반환 한 다른 타임 스탬프와 관련된 것으로 만 해석 될 수 있습니다. 스톱워치는 절대 값이 아닌 이러한 상대 값만 노출하기 때문에 더 효과적인 추상화입니다.
Stopwatch stopwatch = Stopwatch.createStarted();
doSomething();
stopwatch.stop(); // optional

long millis = stopwatch.elapsed(TimeUnit.MILLISECONDS);

log.info("that took: " + stopwatch); // formatted string like "12.3 ms"


답변

이제 다음과 같이 시도 할 수 있습니다.

Instant starts = Instant.now();
Thread.sleep(10);
Instant ends = Instant.now();
System.out.println(Duration.between(starts, ends));

출력은 ISO 8601입니다.


답변

Spring은 우아한 org.springframework.util.StopWatch클래스 (spring-core 모듈)를 제공합니다.

StopWatch stopWatch = new StopWatch();
stopWatch.start();
     // Do something
stopWatch.stop();
     System.out.println(stopWatch.getTotalTimeMillis());


답변

사용 System.currentTimeMillis()시작 시간과 종료 시간을 얻을 차이를 계산합니다.

class TimeTest1 {
  public static void main(String[] args) {

    long startTime = System.currentTimeMillis();

    long total = 0;
    for (int i = 0; i < 10000000; i++) {
      total += i;
    }

    long stopTime = System.currentTimeMillis();
    long elapsedTime = stopTime - startTime;
    System.out.println(elapsedTime);
  }
} 

이 튜토리얼의 추가 정보


답변

의 경과 변수가 있기 때문에 코드는 작동하지 않습니다 getElapsedTimeSecs()하지 않는 것입니다 floatdouble.


답변

내장 된 Stopwatch 유틸리티는 없지만 JSR-310 (Java 8 Time)에서는 간단하게 수행 할 수 있습니다.

ZonedDateTime now = ZonedDateTime.now();
// Do stuff
long seconds = now.until(ZonedDateTime.now(), ChronoUnit.SECONDS);

나는 이것을 제대로 벤치마킹하지 않았지만 Guava의 스톱워치를 사용하는 것이 더 효과적이라고 생각합니다.