system.nanotime() 是测量代码执行耗时最可靠的方式,因其基于高精度单调递增计时器、不受系统时钟调整影响、精度达纳秒级且严格递增;需用两次调用差值计算,结果为非负 long 值,单位纳秒,注意精度限制与使用场景。

System.nanoTime() 是 Java 中获取纳秒级时间戳的最可靠方式,适合测量代码执行耗时,但它返回的是“自某个未指定起点起的纳秒数”,不是绝对时间,所以必须用差值才有意义。
为什么用 nanoTime 而不是 currentTimeMillis?
currentTimeMillis 返回毫秒级时间,受系统时钟调整(如 NTP 同步)影响,可能回拨或跳变,不适合测间隔;nanoTime 基于高精度单调递增计时器(如 CPU TSC),不受系统时间干扰,精度通常在几纳秒到几十纳秒,且严格递增。
正确获取两次操作间的差值
只需调用两次 System.nanoTime(),相减即可。注意:结果是 long 类型,单位为纳秒,需根据需要转为微秒、毫秒等。
- 第一次调用放在操作开始前(紧挨着要测的代码)
- 第二次调用放在操作结束后(紧随其后)
- 差值 = endNanos - startNanos,一定为非负数(nanoTime 单调)
- 避免在差值计算中混入其他逻辑,防止干扰测量结果
实际写法示例
long start = System.nanoTime();
doSomething(); // 你要测量的代码
long end = System.nanoTime();
long durationNs = end - start; // 纳秒差值
double durationMs = durationNs / 1_000_000.0; // 转毫秒(保留小数)
注意事项和常见误区
nanotime 的精度不等于准确度——底层硬件和 JVM 实现会影响实际分辨率;短于 100ns 的操作可能测不准;多次运行取最小值更合理(排除 JIT 预热、GC 干扰等);不要用它做超长间隔计时(如超过数小时,可能因计数器溢出或精度漂移失准)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











