Java에서 이벤트의 경과 시간을 어떻게 계산합니까? [복제하다
문제
이 질문은 이미 여기에 답이 있습니다.
이벤트의 경과 시간을 계산할 수 있도록 Java를 사용하여 시스템 시계에 액세스하는 간단하고 쉬운 방법은 무엇입니까?
해결책
나는 사용하지 않을 것이다 System.currentTimeMillis()
경과 시간을 측정하기 위해. currentTimeMillis()
'Wall-Clock'시간을 반환합니다.이 시간은 변경 될 수 있습니다 (예 : 일광 절약, 관리자 사용자가 시계 변경) 및 간격 측정을 기울입니다.
System.nanoTime()
, 반면에, '일부 기준점'(예 : JVM 시작) 이후 나노초 수를 반환하므로 시스템 클록 변경에 취약하지 않습니다.
다른 팁
이것은 일부 샘플 코드입니다.
long startTime = System.currentTimeMillis();
// Run some code;
long stopTime = System.currentTimeMillis();
System.out.println("Elapsed time was " + (stopTime - startTime) + " miliseconds.");
Apache Commons-Lang은 또한 당신의 목적에 맞는 스톱워치 클래스를 가지고 있습니다. System.CurrentTimeMillis ()를 사용하므로 여전히 해상도 문제가 있지만 잠시 멈출 수 있습니다. 이벤트 통계에 대해 지금 표준으로 사용합니다.
http://commons.apache.org/lang/api-release/org/apache/commons/lang/time/stopwatch.html
그만큼 Leigh의 답변 맞다.
Java.Time
Java 8 이상에는 Java.Time 프레임 워크가 내장되어 있습니다.
an Instant
Nanosecond 해상도 (1 초의 십수 분율의 최대 9 자리)가있는 UTC 타임 라인의 순간입니다. 그만큼 now
메소드는 현재 날짜 시간을 가져옵니다.
Instant now = Instant.now();
2016-03-12T04 : 29 : 39.123Z
한 쌍의 경과 시간을 계산할 수 있습니다. Instant
객체는 a Duration
. 지속 시간은 나노 초 분해능을 사용하여 최대 초의 최대 값으로 오랫동안 유지할 수 있습니다. 이것은 우주의 현재 추정 연령보다 큽니다.
Duration duration = Duration.between( startInstant , stopInstant );
기본 출력 Duration::toString
표준입니다 ISO 8601 체재. 총 나노 초를 요청할 수도 있습니다 (toNanos
) 또는 밀리 초 (toMillis
), 다른 금액뿐만 아니라.
Java 8
Java 8에서, 현재 모멘트를 가져 오는 것은 밀리 초 분해능으로 만 해결됩니다 (1 초의 십수 분율의 최대 3 자리). 따라서 Java.Time 수업은 할 수 있습니다 가게 나노초는 밀리 초로 현재 모멘트 만 결정할 수 있습니다. 이 제한은 레거시 문제 (기본값 Clock
구현 사용 System.currentTimeMillis()
).
Java 9
Java 9 이후에서는 기본값이 있습니다 Clock
구현은 현재 순간을 최대 나노초 해상도로 결정할 수 있습니다. 실제로 그렇게하는 것은 컴퓨터의 시계 하드웨어의 미세에 달려 있습니다.
자세한 내용은이 OpenJDK 문제 페이지를 참조하십시오. java.time.clock.systemutc ()의 구현 정밀도를 높이십시오.
마이크로 벤치 마크
귀하의 목적이 벤치마킹 인 경우 : 다음과 같은 다른 질문을 살펴보십시오.
단기 벤치마킹을 지원하기 위해 프레임 워크를 사용할 수 있습니다.
java.lang.System.currentTimeMillis()
또는 java.lang.System.nanoTime()
경과 시간을 측정하기 위해 노력해야합니다.
다음은 Leigh의 답변에 제안 된대로 System.nanotime ()을 사용하여 작성한 작은 스톱워치 클래스입니다.
public class StopWatch {
// Constructor
public StopWatch() {
}
// Public API
public void start() {
if (!_isRunning) {
_startTime = System.nanoTime();
_isRunning = true;
}
}
public void stop() {
if (_isRunning) {
_elapsedTime += System.nanoTime() - _startTime;
_isRunning = false;
}
}
public void reset() {
_elapsedTime = 0;
if (_isRunning) {
_startTime = System.nanoTime();
}
}
public boolean isRunning() {
return _isRunning;
}
public long getElapsedTimeNanos() {
if (_isRunning) {
return System.nanoTime() - _startTime;
}
return _elapsedTime;
}
public long getElapsedTimeMillis() {
return getElapsedTimeNanos() / 1000000L;
}
// Private Members
private boolean _isRunning = false;
private long _startTime = 0;
private long _elapsedTime = 0;
}