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
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
'programing' 카테고리의 다른 글
Nginx로 PHP를 실행할 때 파일을 찾을 수 없음 (0) | 2021.01.17 |
---|---|
django-저장하기 전에 이전 필드 값과 새 필드 값 비교 (0) | 2021.01.17 |
탭에서 Winforms NumericUpDown의 모든 텍스트를 선택하는 방법은 무엇입니까? (0) | 2021.01.17 |
파이썬에서 삼중 따옴표 안에 변수를 넣을 수 있습니까? (0) | 2021.01.17 |
DictCursor가 psycopg2에서 작동하지 않는 것 같습니다. (0) | 2021.01.17 |