有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

爪哇为什么是一种特殊的番石榴秒表。调用比其他调用晚很多吗?(以邮递方式输出)

我正在做一个小游戏项目,想追踪时间来处理物理问题。在浏览了不同的方法之后,起初我决定使用Java的InstantDuration类,现在切换到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) 个答案

  1. # 1 楼答案

    你在elapsed()返回的Duration上调用^{},这不是你想要的

    aDuration的内部表示是秒数加上纳米偏移量,以表示持续时间内整秒的任何额外分数Duration.getNano()返回nano偏移量,除非同时调用Duration.getSeconds(),否则几乎不应该调用它

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

    编辑:在这种情况下,这并不能解释你看到了什么,因为看起来打印的纳米偏移量可能都在同一秒之内,但你仍然不应该使用getNano()

    实际的问题可能是在第一次调用期间必须进行的类加载或额外工作,以及/或JIT提高未来调用的性能(尽管我认为循环10次并不一定足以让您看到JIT的许多变化)