Метод .toNanos () работает неправильно - PullRequest
2 голосов
/ 07 октября 2019

Я попытался создать метод, который даст мне представление о том, сколько времени требуется для запуска моих программ, и по неизвестной причине я не могу получить наносекунды.

Я пытался прочитатьо следующих классах, но не смог узнать, что я делаю не так: import java.time.Duration;import java.time.Instant;

Методы:

public static String calcExecutionTime(Instant startTime, Instant endTime) {
    if ((Duration.between(startTime, endTime).toNanos()) < 1000000) {
        return Duration.between(startTime, endTime).toNanos() + " nanoseconds.";
    } else if ((Duration.between(startTime, endTime).toMillis()) < 1000) {
        return Duration.between(startTime, endTime).toMillis() + " milliseconds.";
    } else if ((Duration.between(startTime, endTime).toSeconds()) < 100) {
        return Duration.between(startTime, endTime).toSeconds() + " seconds.";
    } else if ((Duration.between(startTime, endTime).toMinutes()) < 60) {
        return Duration.between(startTime, endTime).toMinutes() + " minutes.";
    } else {
        return Duration.between(startTime, endTime).toHours() + " hoursm.";
    }
}

Основное здесь:

    Instant instantStart = Instant.now();
    Instant instantEnd = Instant.now();
    System.out.print("Execution time for this program: " + calcExecutionTime(instantStart, instantEnd));

Если я использую старый System.nanoTime ();Я получаю результат 300-400 наносекунд, но с помощью toNanos () я получаю 0 в той же ситуации.

Редактировать: я не использую getNano (), я использую toNanos ()

Ответы [ 2 ]

0 голосов
/ 07 октября 2019

Я бы пошел с комментарием @ Pshemo о Instant.now().

https://docs.oracle.com/javase/8/docs/api/java/time/Instant.html#now--:

Это запросит системные часы UTC чтобы получить текущий момент.

Куда ведет ссылка:

Это может использовать System.currentTimeMillis () или часы с более высоким разрешением, если оно доступно.

Таким образом, он может иметь или не иметь более высокую точность, чем миллисекунды. В вашем случае «может не иметь», кажется, применяется.

0 голосов
/ 07 октября 2019

Внимательно прочитайте описание метода getNano () :

Получает количество наносекунд в течение секунды в этой длительности. Длина продолжительности сохраняется с использованием двух полей - секунд и наносекунд. Часть наносекунд - это значение от 0 до 999 999 999, которое является корректировкой длины в секундах. Общая продолжительность определяется путем вызова этого метода и getSeconds ().

Nano-часть возвращает вам только количество нано-секунд в текущей секунде. На самом деле я написал небольшую статью об этой проблеме с примером кода: Java 8 пакет времени Java: преобразование Duration в миллисекунды

...