为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Qyouu 2022-11-02 17:21:28
我正在开发一个小型游戏项目,并希望跟踪时间以处理物理。在浏览了不同的方法之后,起初我决定使用 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);}标准输出:30700180700018089001811600181240018133001830200183320018345001835500谢谢你的帮助。
查看完整描述

1 回答

?
POPMUISE

TA贡献1765条经验 获得超5个赞

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

a 的内部表示Duration秒数加上持续时间中任何额外的整秒分数的纳米偏移量。Duration.getNano()返回该纳米偏移量,除非您还调用Duration.getSeconds().

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

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

实际问题可能是在第一次调用期间必须发生的类加载或额外工作的某种组合,和/或 JIT 提高未来调用的性能(尽管我认为循环 10 次不一定足以让你看到很多JIT 的任何变化)。


查看完整回答
反对 回复 2022-11-02
  • 1 回答
  • 0 关注
  • 73 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信