System.nanoTime()是Java中用于高精度时间测量的唯一可靠方法,返回纳秒级单调递增计时值,仅适用于同一JVM内计算时间差;需两次调用相减后除以1000得微秒值,不可用于绝对时间或与currentTimeMillis()混用。

System.nanoTime() 是 Java 中最精准的计时工具,它返回的是纳秒级时间戳(实际精度取决于系统),适合测量短小代码块的执行耗时,尤其适用于算法性能微基准测试。但要注意:它不表示绝对时间,只用于计算时间差;且不能直接得到“微秒”,需手动换算。
正确获取纳秒差并转为微秒
调用两次 System.nanoTime(),相减得到纳秒耗时,再除以 1000 得到微秒值(整数截断):
long start = System.nanoTime(); // 要测量的代码块(务必简短、无 I/O、无 GC 干扰) int result = computeSomething(); long end = System.nanoTime(); <p>long nanos = end - start; long micros = nanos / 1000; // 向下取整,单位:微秒</p>
注意:不要用 System.currentTimeMillis() 替代,其精度通常只有毫秒级,无法分辨微秒差异。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
避免常见干扰因素
- 预热 JVM:首次运行会触发 JIT 编译和类加载,耗时异常偏高。建议循环执行多次(如 10000 次),丢弃前若干次结果(如前 100 次)
- 减少外部干扰:关闭 IDE 日志、禁用后台程序;避免在测量中打印、创建对象、触发 GC(如避免 String 拼接)
- 单线程测量:确保被测代码在同一线程执行,避免上下文切换影响
- 防止代码被 JIT 优化掉:将计算结果赋值给 volatile 变量或用于后续不可省略的逻辑(例如 return 或输出)
简单可靠的微型基准模板
以下是一个轻量、可复用的测量片段(非生产级 JMH,但适合快速验证):
立即学习“Java免费学习笔记(深入)”;
volatile int sink; // 防止 JIT 优化掉计算
<p>long totalNanos = 0;
int iterations = 10000;
for (int i = 0; i < iterations; i++) {
long start = System.nanoTime();
sink = computeSomething(); // 确保结果被使用
long end = System.nanoTime();
totalNanos += (end - start);
}
double avgMicros = (totalNanos / (double) iterations) / 1000.0;
System.out.printf("平均耗时: %.2f μs%n", avgMicros);</p>何时该用 JMH 而非 nanoTime
当需要严谨对比不同实现、评估缓存效应、控制预热/测量轮次、隔离 GC 影响时,JMH(Java Microbenchmark Harness) 是标准选择。nanoTime 适合快速探查、调试阶段粗略对比,或嵌入到单元测试中做回归检查。自行手写 nanoTime 测量易受偏差影响,不推荐用于发布级性能报告。


















