测耗时用 nanoTime:不要把一次运行当基准
比较两种写法时,第一次运行可能受类加载、JIT 和缓存影响。墙上时钟还可能校正,直接相减并不适合精细耗时测量。
问题从哪里出现
比较两种写法时,第一次运行可能受类加载、JIT 和缓存影响。墙上时钟还可能校正,直接相减并不适合精细耗时测量。
理解核心机制
System.nanoTime 用于测量同一 JVM 内经过的时间,只使用差值而不解释其绝对起点。可靠微基准还需处理预热、死代码消除和测量噪声,通常应使用 JMH 等专门工具。
动手做一个小实验
Java 17 或更新版本;将示例保存为 Demo.java,执行 javac Demo.java 后运行 java Demo。
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 负载、硬件频率、垃圾回收与虚拟化环境都会影响结果,打印本身也不应放进被测循环。
继续练习
把同一实验重复多次并记录环境,解释为什么不能从单次更小的数字推出稳定的性能优势。