WMX · 随记
·Java· 3 分钟阅读

测耗时用 nanoTime:不要把一次运行当基准

比较两种写法时,第一次运行可能受类加载、JIT 和缓存影响。墙上时钟还可能校正,直接相减并不适合精细耗时测量。

Java 系列概览:类型与值、状态与资源、边界验证
Java 系列概览:类型与值、状态与资源、边界验证 点击图片查看大图 ↗

问题从哪里出现

比较两种写法时,第一次运行可能受类加载、JIT 和缓存影响。墙上时钟还可能校正,直接相减并不适合精细耗时测量。

理解核心机制

System.nanoTime 用于测量同一 JVM 内经过的时间,只使用差值而不解释其绝对起点。可靠微基准还需处理预热、死代码消除和测量噪声,通常应使用 JMH 等专门工具。

动手做一个小实验

Java 17 或更新版本;将示例保存为 Demo.java,执行 javac Demo.java 后运行 java Demo。

Java10 行 · 可横向滚动
public class Demo {
    public static void main(String[] args) {
        long start = System.nanoTime();
        long result = 0;
        for (int i = 0; i < 1000; i++) result += i;
        long elapsed = System.nanoTime() - start;
        System.out.println("result=" + result);
        System.out.println("elapsed ns=" + elapsed);
    }
}

适用边界与常见误区

示例只说明 API 用法,不是性能证据。CPU 负载、硬件频率、垃圾回收与虚拟化环境都会影响结果,打印本身也不应放进被测循环。

继续练习

把同一实验重复多次并记录环境,解释为什么不能从单次更小的数字推出稳定的性能优势。

参考资料

阅读相关官方文档或原始资料 ↗

← 返回文章归档