You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 07:25:17