system.nanotime()是java中最精确的计时工具,适合测量代码块执行延迟(纳秒级)但不能获取绝对时间;它基于高精度单调递增硬件计时器,而currenttimemillis精度低且可能跳变;正确用法为两次调用取差值,需避免gc、io干扰,多次测量取平均更可靠。

System.nanoTime() 是 Java 中最精确的计时工具,适合测量代码块执行延迟(纳秒级),但不能用于获取绝对时间。
为什么用 nanoTime 而不是 currentTimeMillis
currentTimeMillis 返回毫秒级时间,精度受系统时钟影响,可能跳变或不连续;nanoTime 基于高精度计时器(如 CPU TSC 或硬件计数器),单调递增、无跳变、分辨率通常在几纳秒到几十纳秒,专为性能测量设计。
正确测量单个代码块延迟
- 调用 System.nanoTime() 获取起始时间戳(long 类型)
- 执行待测代码(避免包含 GC、IO 等干扰操作)
- 再次调用 System.nanoTime() 获取结束时间戳
- 相减得到纳秒级耗时:end - start
示例:
long start = System.nanoTime(); // 待测逻辑,例如:int result = computeHeavyTask(); long end = System.nanoTime(); long elapsedNanos = end - start;
注意事项和常见陷阱
- 不要用 nanoTime 做跨 JVM 或跨进程时间比对——它只在单个 JVM 内有意义
- 避免在测量中触发 Full GC 或大量对象分配,否则会污染结果
- 单次测量误差大,建议多次运行取平均值或使用 JMH 等专业基准测试框架
- 注意数值溢出风险:虽然 long 足够大(约 292 年),但若 start 和 end 相差过大(如超 100 秒),仍需确保逻辑合理
简单但实用的封装方法
可写一个轻量工具方法辅助调试:
public static long time(Runnable task) {
long start = System.nanoTime();
task.run();
return System.nanoTime() - start;
}
// 使用:long ns = time(() -> doSomething());
返回值单位是纳秒,如需毫秒可除以 1_000_000L,微秒除以 1_000L。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











