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() 替代,其精度通常只有毫秒级,无法分辨微秒差异。
将后端 Java 接口文档转换为前端 TypeScript 类型定义(interface / type)。输入:飞书文档、Spring Boot 接口文档、Swagger/OpenAPI、手写 API 文档等。输出:包含请求参数与响应结果的 .md 文件,含完整 JSDoc 注释。触发关键词:Java 转 TS、接口转换、生成前端类型、接口文档转 TypeScript、DTO/VO/BO 转 interface、后端文档转前端类型、生成接口类型、类型定义生成。
避免常见干扰因素
- 预热 JVM:首次运行会触发 JIT 编译和类加载,耗时异常偏高。建议循环执行多次(如 10000 次),丢弃前若干次结果(如前 100 次)
- 减少外部干扰:关闭 IDE 日志、禁用后台程序;避免在测量中打印、创建对象、触发 GC(如避免 String 拼接)
- 单线程测量:确保被测代码在同一线程执行,避免上下文切换影响
- 防止代码被 JIT 优化掉:将计算结果赋值给 volatile 变量或用于后续不可省略的逻辑(例如 return 或输出)
简单可靠的微型基准模板
以下是一个轻量、可复用的测量片段(非生产级 JMH,但适合快速验证):
volatile int sink; // 防止 JIT 优化掉计算 <p>long totalNanos = 0; int iterations = 10000; for (int i = 0; i </p>
何时该用 JMH 而非 nanoTime
当需要严谨对比不同实现、评估缓存效应、控制预热/测量轮次、隔离 GC 影响时,JMH(Java Microbenchmark Harness) 是标准选择。nanoTime 适合快速探查、调试阶段粗略对比,或嵌入到单元测试中做回归检查。自行手写 nanoTime 测量易受偏差影响,不推荐用于发布级性能报告。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










