Как мне вычислить прошедшее время события в 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.время
В Java 8 и более поздних версиях встроен фреймворк java.time.
Ан Instant
представляет собой момент на временной шкале в UTC с разрешением в наносекунду (до 9 цифр десятичной доли секунды).В 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
), а также другие суммы.
Java 8
В Java 8 выборка текущего момента разрешается только с разрешением в миллисекунду (до 3 цифр десятичной доли секунды).Таким образом, в то время как классы java.time могут Магазин наносекунды они могут определить текущий момент только с помощью миллисекунд.Это ограничение связано с устаревшей проблемой (по умолчанию Clock
использование при реализации System.currentTimeMillis()
).
Java 9
В Java 9 и более поздних версиях значение по умолчанию Clock
реализация может определять текущий момент с разрешением до наносекунды.На самом деле это зависит от тонкости часового оборудования вашего компьютера.
Смотрите эту страницу проблемы OpenJDK для получения дополнительной информации: Повысить точность реализации java.time.Clock.systemUTC()
Микро-Бенчмарк
Если вашей целью является бенчмаркинг, обязательно рассмотрите другие Вопросы, такие как:
Доступны фреймворки для оказания помощи в проведении краткосрочного бенчмаркинга.
java.lang.System.currentTimeMillis()
или java.lang.System.nanoTime()
должно сработать, чтобы измерить затраченное время.
Вот небольшой класс секундомера, который я написал, используя 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;
}