Это просто пояснение на примере того, насколько это ситуативно.
Я проверил выполнение «нормального» цикла for (int i = 0; i < list.size(); i++)
и микрооптимизированного для цикла for (int i = -1, size = list.size(); ++i < size;)
. Я запустил оба теста в командной строке и обнаружил ОГРОМНУЮ разницу.
Результаты бега в затмении:
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;
}
}