27 votes

Performances: itération dans une liste en Java

Est-il plus lent de parcourir une liste en Java comme celle-ci:

 for (int i=0;i<list.size();i++) {
    .. list.get(i)
}
 

par opposition à:

 for (Object o: list) {
    ... o
}
 

56voto

Pablo Fernandez Points 32003

Je suppose que vous demander de sortir de la pure curiosité et de ne pas citer Knuth (quelqu'un sera probablement).

Je crois qu'une fois que votre code est compilé, il ne fait pas de différence. Cela ne faire une différence avant (exemple 2 est beaucoup plus concis et lisibles), donc aller pour le numéro 2, et ne se soucient pas du reste.

Juste mes 2 cents

MODIFIER

Noter que votre code dans l'extrait numéro 1 calcule list.size() chaque fois que la boucle s'exécute, qui pourrait le rendre encore plus lent que le numéro 2

ENCORE UNE AUTRE ÉDITION

Quelque chose que j'avais à faire une double vérification, Joshua Bloch recommande l'utilisation d' for each boucles (voir l'article 46, de de Efficace Java). Je crois que les extrémités de toutes sortes de discussions. Merci Josh! :)

8voto

SLaks Points 391154

Il ne devrait pas y avoir de différences notables dans les performances des listes normales.

Pour les listes chaînées, l'itérateur sera beaucoup plus rapide, en particulier pour les grandes listes.

3voto

Bill the Lizard Points 147311

Selon les tests de référence dans la boucle While, Pour la boucle et Itérateur Test de Performance, de Java et de la JavaRanch question "est à l'aide de ArrayList.iterator() est plus rapide que la boucle ArrayList en boucle?" l'itérateur est en fait un peu plus lent.

J'avais toujours en faveur de la lisibilité à moins que je l'avais étalonné mon ensemble de l'application et a constaté que la boucle soit mon goulot d'étranglement, si.

3voto

luis.espinal Points 4145

IL PEUT Y AVOIR UNE DIFFÉRENCE.

Si une Liste de mise en œuvre implémente java.util.RandomAccess (comme ArrayList n'), alors il est juste plus rapide à utiliser sa méthode get() sur une interator.

Si elle ne met pas en œuvre de java.util.RandomAccess (par exemple, LinkedList ne fonctionne pas), alors il est beaucoup plus rapide d'utiliser un itérateur.

Toutefois, cela ne importe si vous utilisez des listes contenant des milliers d' (éventuellement dispersés) des objets ou qui sont sans cesse parcourue (comme si l'exécution de grandes quantités de mathématiques sur la Liste des objets représentant des vecteurs numériques.)

3voto

Andrey Chaschev Points 6372

Créé un microbenchmark pour la question et a été surpris de voir pour chaque runing 2x-3x plus vite qu'un indexés boucle. La seule explication que j'ai, c'est que pour chaque version peut ne pas avoir besoin de la gamme des vérifications qui sont faites par des ArrayList.get(int index).

Pour les très petites listes (10 éléments), le résultat était le même. Pour 100 éléments pour-chaque est de 1,5 x plus vite, pour 10000-100000 éléments, il est plus rapide 2x-3x fois.

Les tests sont exécutés sur un aléatoire dataset et les sommes de contrôle sont en cours de vérification à la fin, donc JIT chearing est très peu probable que de prendre place dans ces.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X