为什么特定 Guava Stopwatch.elapsed() 调用比其他调用晚得多?

我正在开发一个小型游戏项目,并希望跟踪时间以处理物理。在浏览了不同的方法之后,起初我决定使用 JavaInstant和Duration类,现在切换到 Guava 的Stopwatch实现,但是,在我的代码片段中,这两种方法在第二次调用runtime.elapsed(). 从长远来看,这似乎不是一个大问题,但为什么会发生这种情况呢?


我尝试在 Windows 和 Linux(Ubuntu 18.04)中以焦点和线程的形式运行下面的代码,结果保持不变 - 确切的值不同,但出现了差距。我正在使用带有 JDK 11 的 IntelliJ IDEA 环境。


主要片段:


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

谢谢你的帮助。


Qyouu
浏览 146回答 1
1回答

POPMUISE

您正在调用返回的 by&nbsp;Duration.getNano(),这不是您想要的。Durationelapsed()a 的内部表示Duration是秒数加上持续时间中任何额外的整秒分数的纳米偏移量。Duration.getNano()返回该纳米偏移量,除非您还调用Duration.getSeconds().您可能想要调用的方法是toNanos(),它将整个持续时间转换为纳秒数。编辑:在这种情况下,这并不能解释你所看到的,因为看起来正在打印的纳米偏移量可能都在同一秒内,但你仍然不应该使用getNano().实际问题可能是在第一次调用期间必须发生的类加载或额外工作的某种组合,和/或 JIT 提高未来调用的性能(尽管我认为循环 10 次不一定足以让你看到很多JIT 的任何变化)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java