system.nanotime()是java中测量代码执行耗时最常用且最可靠的方式,因其返回纳秒级单调递增时间戳,不受系统时钟调整影响,而currenttimemillis()精度低且可能跳变。

Java中用System.nanoTime()测速,是获取高精度时间差最常用也最可靠的方式。它返回的是纳秒级的单调递增时间戳,不受系统时钟调整影响,特别适合测量代码执行耗时。
为什么不用System.currentTimeMillis()?
System.currentTimeMillis()返回自1970年1月1日以来的毫秒数,精度通常只有10–15毫秒(取决于操作系统),且可能因NTP同步或手动调时而跳变,导致测出负值或异常大值。而nanoTime()基于底层高精度计时器(如CPU TSC),精度可达纳秒级(实际有效位一般为微秒级),且严格单调,专为性能测量设计。
正确使用nanoTime()的写法
关键在于:只计算差值,不直接解释绝对值;起止调用要尽可能靠近待测代码;避免在循环内重复调用造成干扰。
- 记录起点:
long start = System.nanoTime(); - 执行目标代码(尽量排除JIT预热、GC等干扰)
- 记录终点:
long end = System.nanoTime(); - 计算耗时:
long elapsed = end - start;(单位是纳秒) - 如需毫秒:用
(double) elapsed / 1_000_000,注意类型转换避免整数截断
常见陷阱与优化建议
单纯一次测量意义不大,容易受JVM预热、上下文切换、GC等干扰。真实性能分析需结合多次采样和统计。
- 先预热:运行目标代码几十到几百次,让JIT编译完成
- 多轮测量:至少10–100次独立运行,取平均值或中位数
- 避免在测量段内创建对象或触发GC,否则会污染结果
- 用
Thread.sleep(0)或Thread.yield()无法保证调度,不推荐用于“隔开”测量 - 对极短操作(如单个加法),要考虑JVM指令重排或空循环优化,可加入volatile读写防止优化
简单示例:对比两种字符串拼接方式
以下是一个典型但实用的对比场景:
// 预热 for (int i = 0; i <p>注意:真实对比应统一变量生成逻辑(如用StringBuilder vs +),并隔离JIT影响。生产环境推荐用JMH框架替代手写nanoTime。</p>
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











