méthodes dans le foreach et pour les boucles en java
Ma question est au sujet de l'optimisation en java en utilisant l'Android compilateur. Sera carte.les valeurs de() dans la suite être appelée à chaque itération, ou le Android compilateur d'optimiser ça.
LinkedHashMap<String, Object> map;
for (Object object : map.values())
{
//do something with object
}
De même, ici, est un autre exemple. va accédez à la liste.size() sera appelée à chaque itération?
List<Object> aList;
for (int i = 0; i < aList.size(); i++)
{
object = aList.get(i);
//do something with i
}
Et après tout cela, faut-il vraiment d'importance si elle appelle les méthodes à chaque itération? Ne Carte.les valeurs de(), et de la Liste.size() faire beaucoup de chose?
- C'est une Java question qui n'a rien à voir avec Android en particulier.
- Je comprends l'intérêt de cette question, mais pour tout le monde réel but, j'avais suggèrent fortement de code de profil avant de l'optimisation de ce dernier.
- Il est parfaitement logique de se demander si un style de codage est inhérente au rendement avantage sur l'autre. Aussi, le profilage a ses limites. Si vous codez pour Android, votre code est susceptible de fonctionner sur une grande variété de plates-formes, dont certaines peuvent avoir un compilateur JIT, certains de ce qui ne va pas, et certains qui n'existent même pas encore.
- Je suis d'accord. Je veux juste mettre en garde les gens de ne pas prématurément d'optimiser, ce qui est pire que de perdre un cycle ici ou là.
Vous devez vous connecter pour publier un commentaire.
Dans le premier exemple,
map.values()
sera évaluée une fois. Selon le Section 14.4.2 de la Spécification du Langage Java, c'est équivalent à:Dans le second,
aList.size()
sera appelée chaque fois que le test est évalué. Pour des raisons de lisibilité, il serait préférable de code comme:Cependant, par la Android docs, ce sera plus lent. En supposant que vous ne pouvez pas changer la taille de la liste à l'intérieur de la boucle,
la manière la plus rapideune autre solution serait de sortir de la taille de la liste à l'avance de la boucle:Ce sera beaucoup plus rapide (Android docs lié ci-dessus-dire par un facteur de 3) si
aList
se trouve être unArrayList
, mais est susceptible d'être plus lente (éventuellement par un lot) pour unLinkedList
. Tout dépend exactement ce genre deList
mise en œuvre de la classeaList
est.