2
當我檢查這Question不能相信它,所以我測試,似乎是真實的。循環內的聲明似乎比聲明外部循環更快。有人能解釋這是爲什麼嗎?爲什麼在循環內聲明似乎比在Java中聲明外部循環更快?
這裏是我的測試代碼:
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運行它。
行'System.out.println(intermediateResult);'當你做測試時註釋掉了嗎? –
該代碼看起來非常熟悉;)http://codereview.stackexchange.com/a/108562/87743 – Zymus
@Paul Boddington是的,它是爲了避免超出輸出。 –