爪哇为什么是一种特殊的番石榴秒表。调用比其他调用晚很多吗?(以邮递方式输出)
我正在做一个小游戏项目,想追踪时间来处理物理问题。在浏览了不同的方法之后,起初我决定使用Java的Instant
和Duration
类,现在切换到Guava的Stopwatch
实现,然而,在我的代码片段中,这两种方法在runtime.elapsed()
的第二次调用中都有很大的差距。从长远来看,这似乎不是什么大问题,但为什么会发生呢
我试着在Windows和Linux(Ubuntu18.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 楼答案
你在} ,这不是你想要的
elapsed()
返回的Duration
上调用^{a
Duration
的内部表示是秒数加上纳米偏移量,以表示持续时间内整秒的任何额外分数Duration.getNano()
返回nano偏移量,除非同时调用Duration.getSeconds()
,否则几乎不应该调用它您可能想要调用的方法是
toNanos()
,它将整个持续时间转换为纳秒数编辑:在这种情况下,这并不能解释你看到了什么,因为看起来打印的纳米偏移量可能都在同一秒之内,但你仍然不应该使用
getNano()
实际的问题可能是在第一次调用期间必须进行的类加载或额外工作,以及/或JIT提高未来调用的性能(尽管我认为循环10次并不一定足以让您看到JIT的许多变化)