System.nanoTime()是Java中测量代码执行耗时最常用、最可靠的方式,返回纳秒级单调递增时钟值,仅适用于计算差值,需两次调用取差并避免GC等干扰。

在 Java 中,System.nanoTime() 是获取纳秒级时间戳最常用、最可靠的方式,适合用于**测量代码段执行耗时**,但需注意它不表示绝对时间(如系统时间),而是基于某个未指定起点的单调递增时钟,因此**只能用于计算差值**。
正确使用 nanoTime() 测量执行耗时
核心原则:调用两次 nanoTime(),取差值。必须确保「开始」在「结束」之前,且中间不被干扰(如长时间 GC、线程挂起等会影响精度,但不影响纳秒值本身的正确性)。
- 在待测代码前立即调用一次:
long start = System.nanoTime(); - 在待测代码后立即调用一次:
long end = System.nanoTime(); - 计算耗时:
long elapsed = end - start;(单位:纳秒)
避免常见误区
nanoTime() 返回的是 long 类型纳秒值,但不代表硬件真能稳定分辨 1 纳秒——实际分辨率取决于操作系统和底层硬件(通常为 10–100 纳秒量级)。因此:
- 单次测量可能受噪声干扰,建议多次运行取最小值或平均值(尤其对极短操作)
- 不要用它做跨 JVM 或跨进程的时间比对(起点不同)
- 不要将结果直接当作“真实物理时间”解读,它反映的是相对、单调、高精度的经过时间
- 避免在循环内反复调用 nanoTime() 测量单条语句(调用本身开销可能接近被测语句)
简单实用示例
以下是一个典型用法,测量一个空循环的开销(注意:仅作演示,真实性能分析应使用 JMH):
long start = System.nanoTime(); for (int i = 0; i
输出类似:耗时 427.35 μs。注意单位换算:1 微秒 = 1000 纳秒,1 毫秒 = 1,000,000 纳秒。
进阶提示:结合 try-with-resources 自动计时(Java 7+)
可封装一个简易计时器类,让资源管理更清晰:
public class NanoTimer implements AutoCloseable {
private final long start;
public NanoTimer() { this.start = System.nanoTime(); }
public long elapsed() { return System.nanoTime() - start; }
@Override public void close() { /* 可选:打印或记录 */ }
}
// 使用:
try (NanoTimer t = new NanoTimer()) {
doSomething();
}
System.out.println("耗时: " + t.elapsed() + " ns");
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











