time4j не производит монотонное время в течение долгого времени

Я пытаюсь создать монотонное время в давние времена, используя time4j v5.6, используя приведенный ниже тестовый код.

Но выход не ожидается. Я пропустил какую-либо инициализацию библиотеки? Моя цель состоит в том, чтобы производить монотонное время, но не требует высокой точности, так как это может быть выполнено на стороне клиента либо в Linux/Windows

import net.time4j.SystemClock;

import java.time.Instant;

public class MonotonicClock {
    public static void main(String[] args) {
        SystemClock systemClock = SystemClock.MONOTONIC;
        long t1 = systemClock.currentTimeInMicros() * 1000;
        boolean failed = false;
        for (int i = 0; i < 1000_000; i++) {
            long t2 = systemClock.currentTimeInMicros() * 1000;
            if (t2 < t1) {
                System.out.println(Instant.ofEpochSecond(0, t2) + "<" + Instant.ofEpochSecond(0, t1));
                failed = true;
            }
            t1 = t2;
        }

        if(failed) {
            System.err.println("Test Failed");
        }else {
            System.out.println("Test Passed");
        }
    }
}

person sigirisetti    schedule 03.06.2020    source источник
comment
Какой результат вы получаете и каковы ваши ожидания?   -  person Pateman    schedule 03.06.2020
comment
Неудачный тест. Я ожидал, что lib создаст длинную метку времени, которая такая же или больше, чем предыдущая метка времени   -  person sigirisetti    schedule 03.06.2020
comment
Почему вы умножаете время в микросекундах на 1000?   -  person RealSkeptic    schedule 03.06.2020
comment
Умножать не нужно. просто для просмотра вывода временной метки из Instant, может быть, для этого лучше   -  person sigirisetti    schedule 03.06.2020
comment
Instant.ofEpochSecond(0, t2) - второй параметр корректируется в наносекундах и может быть полной отметкой времени в наносекундах. все в порядке. вы можете запустить пример класса выше и проверить   -  person sigirisetti    schedule 03.06.2020


Ответы (1)


Часы SystemClock.MONOTONIC в конечном счете основаны на System.nanoTime(), см. rel="nofollow noreferrer">исходный код. Последний должен быть монотонным, и, по крайней мере, обработка редких секунд координации здесь безопасно монотонна, но может случиться так, что она не будет монотонной на некоторых многоядерных платформах, где JVM трудно переключаться между ядер для формирования согласованного результата вызова System.nanoTime(). См. также связанный SO-post с более полезными ссылками на дебаты о монотонности System.nanoTime().

Обходной путь может состоять в том, чтобы ввести новую константу SystemClock.MONOTONIC_ENFORCED, которая развертывает алгоритм CAS (на основе java.util.concurrent.atomic.AtomicLong) для сравнения фактического нано-времени с предыдущим (с возможным снижением производительности). Дайте мне знать, если вам нужна эта функция в следующем выпуске Time4J.

person Meno Hochschild    schedule 03.06.2020
comment
Спасибо за всю информацию в посте. Если это не наказывается большим количеством циклов ЦП, то это может быть достойным дополнением в библиотеке. Это будет полезно в тех случаях, когда события необходимо упорядочить по времени. - person sigirisetti; 03.06.2020