자바에 스톱워치가 있습니까? 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()
하지 않는 것입니다 float
나 double
.
답변
내장 된 Stopwatch 유틸리티는 없지만 JSR-310 (Java 8 Time)에서는 간단하게 수행 할 수 있습니다.
ZonedDateTime now = ZonedDateTime.now();
// Do stuff
long seconds = now.until(ZonedDateTime.now(), ChronoUnit.SECONDS);
나는 이것을 제대로 벤치마킹하지 않았지만 Guava의 스톱워치를 사용하는 것이 더 효과적이라고 생각합니다.
