System.currentTimeMillis计时返回负值问题(Windows10+OpenJDK19)
代码执行耗时测量出现负值的问题分析与解决
原代码的核心错误
你用Timestamp.getNanos()计算时间差完全是用错了方法——因为你是通过System.currentTimeMillis()创建的Timestamp,这个构造方法只处理毫秒级时间,纳秒字段永远是0。你看到的负值根本不是真实的时间差,而是对API的误解导致的无意义计算。
改用System.nanoTime()仍出负值的原因
就算换成System.nanoTime(),在Windows 10上偶尔出现几百毫秒的正负偏差,主要有两个原因:
- CPU核心TSC不同步:虽然Windows和Java都做了优化,但部分硬件(尤其是老旧CPU)的不同核心时间戳计数器(TSC)可能没完全同步。当线程在执行过程中被调度到其他核心时,读取的
nanoTime会出现跳跃,导致差值为负。 - JIT优化干扰:你的循环逻辑太简单(只是
o++),JVM的即时编译器会直接把o赋值为1000000000,跳过整个循环。这会让实际执行时间极短,nanoTime的精度误差被放大,看起来像是几百毫秒的偏差,甚至出现负值。
正确的测量代码
要准确测量耗时,得用System.nanoTime()(Java官方推荐的代码耗时测量工具,不受系统时间调整影响),同时要防止JVM优化掉你的测试代码:
public class Main { public static void main(String[] args) { long begin = System.nanoTime(); long times = 1000000000; int o = 0; // 用volatile变量强制保留循环的副作用,避免JIT优化 volatile int temp = 0; for (int i = 0; i < times; i++) { o++; temp = o; } System.out.println(o); long end = System.nanoTime(); // 转换为毫秒输出 System.out.println((end - begin) / 1000000); } }
额外建议
- 单次测量误差大的话,可以多次执行测试代码取平均值,结果会更稳定
- 对于极短的代码片段,Windows上的微小硬件误差无法完全消除,但多次测量能得到接近真实值的结果
内容的提问来源于stack exchange,提问作者behanep757
相关产品推荐
相关产品推荐

