programing

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

procenter 2021. 1. 17. 12:10
반응형

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


이 질문에 이미 답변이 있습니다.

이벤트의 경과 시간을 계산할 수 있도록 Java를 사용하여 시스템 시계에 액세스하는 간단하고 쉬운 방법은 무엇입니까?


나는 System.currentTimeMillis()경과 시간을 측정하는 데 사용하지 않을 것 입니다. currentTimeMillis()변경 될 수있는 '벽시계'시간을 반환하고 (예 : 일광 절약 시간제, 시계를 변경하는 관리자 사용자) 간격 측정 값을 왜곡 할 수 있습니다.

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에는 사용자의 목적에 맞는 StopWatch 클래스도 있습니다. 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은 나노초 분해능 (초의 소수점 이하 최대 9 자리)을 사용하는 UTC 타임 라인의 한 순간입니다. now메서드는 현재 날짜-시간 순간을 가져옵니다.

Instant now = Instant.now();

2016-03-12T04 : 29 : 39.123Z

Instant객체 쌍 사이의 경과 시간을 Duration. 지속 시간은 길게 유지할 수있는 초의 최대 값과 함께 나노초 해상도를 사용합니다. 이것은 현재 추정되는 우주의 나이보다 큽니다.

Duration duration = Duration.between( startInstant , stopInstant );

의 기본 출력은 Duration::toString표준 ISO 8601 형식입니다. 총 나노초 ( toNanos) 또는 밀리 초 ( toMillis) 및 기타 양을 요청할 수도 있습니다 .

자바 8

Java 8에서 현재 순간을 가져 오는 것은 밀리 초 분해능 (초의 소수점 이하 최대 3 자리)으로 만 해석됩니다. 따라서 java.time 클래스는 나노초를 저장할 수 있지만 현재 순간을 밀리 초로 만 결정할 수 있습니다. 이 제한은 레거시 문제로 인한 것입니다 (기본 Clock구현에서는를 사용함 System.currentTimeMillis()).

자바 9

Java 9 이상에서 기본 Clock구현은 최대 나노초 해상도로 현재 순간을 확인할 수 있습니다. 실제로 그렇게하는 것은 컴퓨터의 시계 하드웨어의 섬세함에 달려 있습니다.

자세한 정보는이 OpenJDK 문제 페이지를 참조하십시오 : java.time.Clock.systemUTC () 구현의 정밀도 향상

마이크로 벤치 마크

목적이 벤치마킹이라면 다음과 같은 다른 질문을 확인하십시오.

단기간 벤치마킹을 지원하는 프레임 워크를 사용할 수 있습니다.


java.lang.System.currentTimeMillis()또는 java.lang.System.nanoTime()경과 시간을 측정해야합니다.


다음은 Leigh의 답변에서 제안한대로 System.nanoTime ()을 사용하여 작성한 작은 StopWatch 클래스입니다.

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

참조 URL : https://stackoverflow.com/questions/238920/how-do-i-calculate-the-elapsed-time-of-an-event-in-java

반응형