Почему определенный Guava Stopwatch.elapsed () вызывается намного позже, чем другие?(вывод в посте) - PullRequest
0 голосов
/ 02 мая 2019

Я работаю над небольшим игровым проектом и хочу отслеживать время для обработки физики. После прокрутки различных подходов сначала я решил использовать классы Java Instant и Duration, и теперь переключился на реализацию Stopwatch в Guava, однако в моем фрагменте оба этих подхода имеют большой пробел в второй вызов runtime.elapsed(). В долгосрочной перспективе это не кажется большой проблемой, но почему это происходит?

Я попытался запустить приведенный ниже код как в фокусе, так и в виде потока, в Windows и в Linux (Ubuntu 18.04), и результат остался прежним - точные значения отличаются, но возникает разрыв. Я использую среду IntelliJ IDEA с JDK 11.

Фрагмент из Main:

public static void main(String[] args) {

    MassObject[] planets = {
        new Spaceship(10, 0, 6378000)
    };

    planets[0].run();

}

Это часть моего класса MassObject extends Thread:

public void run() {
    // I am using StringBuilder to eliminate flushing delays.
    StringBuilder output = new StringBuilder();
    Stopwatch runtime = Stopwatch.createStarted();

    // massObjectList = static List<MassObject>;
    for (MassObject b : massObjectList) {
        if(b!=this) calculateGravity(this, b);
    }
    for (int i = 0; i < 10; i++) {
        output.append(runtime.elapsed().getNano()).append("\n");
    }
    System.out.println(output);
}

Стандартный вывод:

30700
1807000
1808900
1811600
1812400
1813300
1830200
1833200
1834500
1835500

Спасибо за вашу помощь.

1 Ответ

3 голосов
/ 02 мая 2019

Вы звоните Duration.getNano() на Duration, возвращаемом elapsed(), а это не то, что вам нужно.

Внутреннее представление Duration - эточисло секунд плюс нано-смещение для любой дополнительной доли целой секунды в продолжительности.Duration.getNano() возвращает это нано-смещение, и его почти никогда не следует вызывать, если только вы не вызываете Duration.getSeconds().

Метод, который вы, вероятно, хотите вызвать, - toNanos(), который преобразует всю длительность вколичество наносекунд.

Редактировать: В этом случае это не объясняет то, что вы видите, поскольку кажется, что печатаемые нано-смещения, вероятно, находятся в пределах одной секунды, ноэто все еще тот случай, когда вы не должны использовать getNano().

. Фактическая проблема, вероятно, заключается в некоторой комбинации загрузки классов или дополнительной работы, которая должна произойти во время первого вызова, и / или JIT, улучшающей производительность в будущем.вызовов (хотя я не думаю, что цикл 10 раз обязательно будет достаточным, чтобы вы увидели большую часть изменений по сравнению с JIT).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...