节点
本文使用endTime - startTime
方法来测量循环的性能,它忽略了JVM预热优化,其结果可能不一致或准确。更好的方法是使用OpenJDK JMH框架进行基准测试,因为它将自动处理JVM的预热问题,请参见此示例– JMH –正向循环与反向循环
针对列表的正向循环与反向循环的Java性能测试,哪个更快?
正向循环
for (int i = 0; i < aList.size(); i++) {
String s = aList.get(i);
}
反向循环
for (int i = aList.size() - 1; i >= 0; i--) {
String s = aList.get(i);
}
1.正向循环与反向循环
LoopForwardReverseTest.java
package com.mkyong.benchmark.bk;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
public class LoopForwardReverseTest {
private static List<String> DATA_FOR_TESTING = Arrays.asList(createArray());
public static void main(String[] argv) {
LoopForwardReverseTest obj = new LoopForwardReverseTest();
obj.forwardLoop();
obj.reverseLoop();
}
public void forwardLoop() {
System.out.println("\n--------- Forward Loop -------\n");
long startTime = new Date().getTime();
for (int i = 0; i < DATA_FOR_TESTING.size(); i++) {
String s = DATA_FOR_TESTING.get(i);
//System.out.println(s);
}
long endTime = new Date().getTime();
long difference = endTime - startTime;
System.out.println("Forward Loop - Elapsed time in milliseconds: " + difference);
}
public void reverseLoop() {
System.out.println("\n--------- Reverse Loop -------\n");
long startTime = new Date().getTime();
for (int i = DATA_FOR_TESTING.size() - 1; i >= 0; i--) {
String s = DATA_FOR_TESTING.get(i);
//System.out.println(s);
}
long endTime = new Date().getTime();
long difference = endTime - startTime;
System.out.println("Reverse Loop - Elapsed time in milliseconds: " + difference);
}
private static String[] createArray() {
int N = 10_000_000;
String sArray[] = new String[N];
for (int i = 0; i < N; i++) {
sArray[i] = "Array " + i;
}
return sArray;
}
}
结果
--------- Forward Loop -------
Forward Loop - Elapsed time in milliseconds: 64
--------- Reverse Loop -------
Reverse Loop - Elapsed time in milliseconds: 49
参考文献
翻译自: https://mkyong.com/java/reverse-loop-versus-forward-loop-in-performance-java/