Java - Boucle inversée versus boucle avant dans les performances
Node
Cet article utilise la méthodeendTime - startTime
pour mesurer les performances d'une boucle, il ignore l'optimisation du préchauffage JVM, le résultat peut ne pas être cohérent ou précis.
Un meilleur moyen consiste à utiliser le framework OpenJDK JMH pour faire les tests de référence, car il prendra en charge automatiquement les problèmes de préchauffage de la JVM, voir cet exemple -JMH – Forward loop vs Reverse loop
Un test de performance Java pour la boucle avant vs la boucle inverse pour une liste, laquelle est la plus rapide?
Boucle avant
for (int i = 0; i < aList.size(); i++) { String s = aList.get(i); }
Boucle inversée
for (int i = aList.size() - 1; i >= 0; i--) { String s = aList.get(i); }
1. Boucle avant ou boucle inverse
LoopForwardReverseTest.java
package com.example.benchmark.bk; import java.util.Arrays; import java.util.Date; import java.util.List; public class LoopForwardReverseTest { private static ListDATA_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; } }
Résultat
--------- Forward Loop ------- Forward Loop - Elapsed time in milliseconds: 64 --------- Reverse Loop ------- Reverse Loop - Elapsed time in milliseconds: 49