Java에서 이벤트의 경과 시간을 어떻게 계산합니까? [복제하다

StackOverflow https://stackoverflow.com/questions/238920

  •  04-07-2019
  •  | 
  •  

문제

이 질문은 이미 여기에 답이 있습니다.

이벤트의 경과 시간을 계산할 수 있도록 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;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top