gpt4 book ai didi

java - 为什么在 Java 中循环内声明似乎比循环外声明更快?

转载 作者:行者123 更新时间:2023-11-30 06:12:02 25 4
gpt4 key购买 nike

当我检查这个 Question不敢相信,所以我测试了一下,似乎是真的。循环内的声明似乎比循环外的声明更快。有人可以解释这是为什么吗?

这是我的测试代码:

public class CycleTest {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
long iterations = 1000000;
warmUp(iterations);
System.out.println("Cycle1");
double individualTime = getAverageTimePerIterationc1(iterations);
iterations = 1000;
double totalTime = getTotalTimec1(iterations);

System.out.println("ns/iteration: " + individualTime);
System.out.println("Total time for " + iterations + " runs: " + totalTime);

System.out.println("Cycle2");
iterations = 1000000;
double individualTime1 = getAverageTimePerIterationc2(iterations);
iterations = 1000;
double totalTime1 = getTotalTimec2(iterations);

System.out.println("ns/iteration: " + individualTime1);
System.out.println("Total time for " + iterations + " runs: " + totalTime1);

}

public static void warmUp(long iterations) {
System.out.println("Starting warmup");
for (int i = 0; i < iterations; i++) {
runCycles();
runCycles1();
}
}

public static double getAverageTimePerIterationc1(long iterations) {
// test
System.out.println("Starting individual time test");
long timeTaken = 0;
for (int i = 0; i < iterations; i++) {
long startTime = System.nanoTime();
runCycles();
timeTaken += System.nanoTime() - startTime;
}
return (double) timeTaken / iterations;
}

public static long getTotalTimec1(long iterations) {
// test
System.out.println("Starting total time test");
long timeTaken = 0;
for (int i = 0; i < iterations; i++) {
long startTime = System.nanoTime();
runCycles();
timeTaken += System.nanoTime() - startTime;
}
return timeTaken;
}

public static double getAverageTimePerIterationc2(long iterations) {
// test
System.out.println("Starting individual time test");
long timeTaken = 0;
for (int i = 0; i < iterations; i++) {
long startTime = System.nanoTime();
runCycles1();
timeTaken += System.nanoTime() - startTime;
}
return (double) timeTaken / iterations;
}

public static long getTotalTimec2(long iterations) {
// test
System.out.println("Starting total time test");
long timeTaken = 0;
for (int i = 0; i < iterations; i++) {
long startTime = System.nanoTime();
runCycles1();
timeTaken += System.nanoTime() - startTime;
}
return timeTaken;
}

private static void runCycles() {
double intermediateResult;
for (int i = 0; i < 1000; i++) {
intermediateResult = i;
intermediateResult += 1;
}
}

private static void runCycles1() {
for (int i = 0; i < 1000; i++) {
double intermediateResult = i;
intermediateResult += 1;
}
}
}

额外的新信息:我已经在 Windows 机器上的 JDK 1.6.0_27 上运行了它。

最佳答案

它们生成相同的代码。这两种方法:

private static void runCycles1() {
double intermediateResult;
for (int i = 0; i < 1000; i++) {
intermediateResult = i;
}
}
private static void runCycles2() {
for (int i = 0; i < 1000; i++) {
double intermediateResult = i;
}
}

在 Java 8 (jdk1.8.0_51) 中生成此字节码:

runCycles1()                runCycles2()
Code: Code:
0: iconst_0 0: iconst_0 i = 0
1: istore_2 1: istore_0
2: goto 11 2: goto 11 goto 11

5: iload_2 5: iload_0 intermediateResult = (double)i
6: i2d 6: i2d
7: dstore_0 7: dstore_1
8: iinc 2, 1 8: iinc 0, 1 i++

11: iload_2 11: iload_0 if (i < 1000) goto 5
12: sipush 1000 12: sipush 1000
15: if_icmplt 5 15: if_icmplt 5
18: return 18: return return

实际的声明不会生成任何代码,所以如果您看到性能上的差异,我会感到惊讶。

所以测试了一下:

for (int j = 0; j < 10; j++) {
long t1 = System.nanoTime();
for (int i = 0; i < 1000_000_000; i++)
runCycles1();
long t2 = System.nanoTime();
for (int i = 0; i < 1000_000_000; i++)
runCycles2();
long t3 = System.nanoTime();
System.out.printf("%d %d%n", t2 - t1, t3 - t2);
}

得到:

4250095  2020120
4067898 0
3904236 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0

它们最终都编译为空!!!

关于java - 为什么在 Java 中循环内声明似乎比循环外声明更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33357585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com