Как мне вычислить прошедшее время события в java?[дубликат]

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

  •  04-07-2019
  •  | 
  •  

Вопрос

На этот вопрос уже есть ответ здесь:

Какой простой способ получить доступ к системным часам с помощью 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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top