Java 中高精度计时?

2022-07-19 06:10:37 +08:00
 Richard14

根据廖雪峰教学博客,java 中处理日期 /时间问题,如无特殊必要应优先采用较新的 java.time 模块。

一个疑问是,写码时常见需求是获取两点之间执行时间。按照该博客说明,精度最高的应该是 Instant 类,所以计算两点间代码执行时间应该可以使用下列代码:

public class Main {
    public class void Main() {
        var start = Instant.now();
        // ... run some code
        System.out.println("done");
        var end = Instant.now();
        System.out.println(instantToDouble(end) - instantToDouble(start));
    }
    
    protected static double instantToDouble(Instant instant) {
    	return instant.getEpochSecond() + instant.getNano() / 1e9;
    }
}

实际得到结果两点间差值是 0.0 ,两个 instant 获得的时间完全一致,让人疑惑因为 instant 理论上是纳秒级精度,而两点之间执行了 sout 代码,sout 根据廖旭峰的说明是一个同步 IO ,所以理论上上述代码不应该输出 0 ,导致它输出 0 的原因是什么呢? instant 精度不够吗,或者 io 流的问题?


另外再顺便问下 instant 是什么设计,导入是通过 import java.time.*导入的,正常来说创建对象应该是用类似 var instant = new Instant().now();这种感觉的句子,为什么 instant 可以直接 var instant = Instant.now()?

3158 次点击
所在节点    Java
21 条回复
zjp
2022-07-21 12:29:01 +08:00
System.nanoTime 的精度可以参考这里
https://shipilev.net/blog/2014/nanotrusting-nanotime/
Instant 是基于毫秒的就算了...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/867144

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX