这只是通过示例来说明这是多么的情景。
我测试了“正常”for 循环 for (int i = 0; i < list.size(); i++) 和微优化 for 循环 for (int i = -1, size = list.size(); ++i < size;) 的执行。我从命令行在 Eclipse 中运行了测试,发现了巨大的差异。
eclipse中运行的结果:
Time for Original: 32552 ms Time for MicroOptimized 32707 ms
Fastest Loop: Original
Slowest loop takes 0.47616121897272057% more time
从命令行运行的结果:
Time for Original: 274489 ms Time for MicroOptimized 30516 ms
Fastest Loop: MicroOptimized
Slowest loop takes 799.4920697339101% more time
所以在 Eclipse 中,两个 for 循环花费相同的时间,但是从命令行运行时,原始版本比微优化版本花费的时间多 800%。差异之大让我大吃一惊。我猜 Eclipse 使用了不同的 JVM,它应用了一些智能优化技巧。
但这并不意味着您应该开始使用微优化版本。在几乎所有情况下,您迭代的列表可能非常小,以至于性能差异可以忽略不计。使用标准版本获得的可读性(每个人都会更快地识别和理解)比不显着的性能提升更有益。
为了完整起见,这是我运行的代码:
public static void main(String[] args) {
List<Byte> list = initializeList();
byte value = 0;
final int NUM_LOOPS = 100;
long startOriginal, startOptimized, endOriginal, endOptimized;
startOptimized = System.currentTimeMillis();
for (int j = 0; j < NUM_LOOPS; j++) {
for (int i = -1, size = list.size(); ++i < size;) {
value = list.get(i);
}
}
endOptimized = System.currentTimeMillis();
startOriginal = System.currentTimeMillis();
for (int j = 0; j < NUM_LOOPS; j++) {
for (int i = 0; i < list.size(); i++) {
value = list.get(i);
}
}
endOriginal = System.currentTimeMillis();
System.out.println(value);
printResults(startOriginal, endOriginal, startOptimized, endOptimized);
}
private static void printResults(long startOriginal, long endOriginal,
long startOptimized, long endOptimized) {
long timeOriginal = endOriginal - startOriginal;
long timeOptimized = endOptimized - startOptimized;
long diff = Math.abs(timeOriginal - timeOptimized);
long min = Math.min(timeOriginal, timeOptimized);
System.out.println("Time for Original: " + timeOriginal + " ms"
+ " Time for MicroOptimized " + timeOptimized + " ms");
System.out.println("Fastest Loop: "
+ ((timeOriginal < timeOptimized) ? "Original"
: "MicroOptimized"));
System.out.println("Slowest loop takes " + ((double) 100 * diff / min)
+ "% more time");
}
public static List<Byte> initializeList(){
List<Byte> list = new ArrayList<Byte>();
final Byte ONE = new Byte((byte) 1);
for (int i = 0; i < Integer.MAX_VALUE / 10; i++) {
list.add(ONE);
}
return list;
}
}