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输出:

时间差极小(多为几纳秒),反映的是两次System.nanoTime()调用的最小开销。 - 代码2输出:

时间差明显更大,体现了数组访问与累加操作的实际执行耗时。
内容的提问来源于stack exchange,提问作者Dyson
相关产品推荐
相关产品推荐

