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

Java中两段执行时间测量代码为何结果有差异?sum是否被执行?

两段Java代码的区别与细节分析

一、核心区别对比

两段代码都用System.nanoTime()测量时间,但核心逻辑差异明显:

  • 代码1循环内仅连续调用两次System.nanoTime(),无任何业务操作,测量的是**System.nanoTime()自身的调用开销+系统时钟最小分辨率**。
  • 代码2在两次时间戳采集之间,加入了数组元素读取与累加操作,同时初始化了测试数组和累加变量,测量的是数组访问+整数累加操作的实际耗时。

代码1完整实现

for (int i = 0; i < 10; i++) {
    long n0 = System.nanoTime();
    long n1 = System.nanoTime();
    System.out.println(" resolution " + (n1 - n0) + " nanoseconds");
}

代码2完整实现

int[] given = {1,2,3,4,5,6,7,8,9,0};
int sum = 0;
for (int i = 0; i < 10; i++) {
    long t0 = System.nanoTime();
    sum += given[i];
    long t1 = System.nanoTime();
    System.out.println(" resolution " + (t1 - t0) + " nanoseconds");
}

二、代码2新增的逻辑

代码2相比代码1,额外包含以下逻辑:

  • 初始化了一个包含10个整数的数组given;
  • 声明并初始化累加变量sum;
  • 在时间测量窗口内,执行数组索引访问(given[i])和整数累加运算(sum += given[i])。

三、sum变量的作用与执行验证

sum的作用

sum变量的核心作用是阻止JIT编译器优化掉目标操作。如果没有这个变量,或者累加结果未被后续使用,JVM的即时编译器会判定given[i]的访问和累加是“无意义的冗余操作”,直接将其删除,导致时间测量结果回到和代码1一样的水平——无法测出目标操作的真实耗时。

sum是否真的被执行?

从当前代码逻辑看,sum确实会被执行,但存在优化风险:如果后续没有对sum进行消费(比如打印sum值、作为返回值等),部分JVM的JIT编译器在激进优化时仍可能消除sum += given[i]操作。不过由于循环次数仅10次,属于小循环,JIT通常来不及做这类优化,所以这段操作大概率会被实际执行。从输出结果也能佐证:代码2的时间差普遍大于代码1,说明中间的数组访问和累加确实占用了时间。

输出结果对比

  • 代码1输出:
    代码1执行时间输出
    时间差极小(多为几纳秒),反映的是两次System.nanoTime()调用的最小开销。
  • 代码2输出:
    代码2执行时间输出
    时间差明显更大,体现了数组访问与累加操作的实际执行耗时。

内容的提问来源于stack exchange,提问作者Dyson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 17:16:03