gpt4 book ai didi

java - 为什么特定的 Guava Stopwatch.elapsed() 调用比其他调用晚得多? (后期输出)

转载 作者:行者123 更新时间:2023-12-01 19:39:13 24 4
gpt4 key购买 nike

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

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

主要片段:

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

感谢您的帮助。

最佳答案

您正在调用 Duration.getNano()elapsed() 返回的 Duration 上,这不是您想要的。

Duration 的内部表示是数加上一个纳米偏移,用于表示整秒中的任何附加分数持续时间。 Duration.getNano() 返回纳米偏移量,并且几乎永远不应该被调用,除非您还调用 Duration.getSeconds()

您可能想要调用的方法是 toNanos(),它将整个持续时间转换为纳秒数。

编辑:在这种情况下,这并不能解释您所看到的内容,因为确实显示正在打印的纳米偏移可能都在同一秒内,但您仍然可以这样做不应该使用 getNano()

实际问题可能是在第一次调用期间必须发生的类加载或额外工作的某种组合,和/或 JIT 提高了 future 调用的性能(尽管我不认为循环 10 次就足够了)看到 JIT 带来的大部分变化)。

关于java - 为什么特定的 Guava Stopwatch.elapsed() 调用比其他调用晚得多? (后期输出),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55942742/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com