Best practice Java : déclaration d'1 variable (locale) dans une boucle - Java - Programmation
Marsh Posté le 28-10-2002 à 12:13:45
Je crois pas que ça change quoi que ce soit de la déclarer avant la boucle. J'imagine que le compilateur doit traiter les deux cas de la même manière au niveau de l'allocation de la mémoire...
Marsh Posté le 28-10-2002 à 12:14:37
Bin ca dépend
mais bon ca va te la déclarer à chaque itération ce qui est bad
Si c'est une variable que tu utilises tout au long de la boucle en dehords. Si c'est une variable que tu initialises à chaque bouche alors à l'intérieur.
Marsh Posté le 28-10-2002 à 12:57:27
DarkLord a écrit a écrit : Si c'est une variable que tu utilises tout au long de la boucle en dehords. Si c'est une variable que tu initialises à chaque bouche alors à l'intérieur. |
Oui et non...
Meme si tu l'initialise a chaque tour de boucle, il faut toujours la declarer AVANT la boucle et la reinitialiser en debut de boucle. Ca evite d'avoir des allocations multiples de memoire, et est donc bien plus leger en termes d'execution.
On parle bien de best practice. On ne peut pas compter sur le compilo... M'enfin on touche egalement a l'optimisation...
Marsh Posté le 28-10-2002 à 13:55:16
Il est exact que déclarer une variable locale dans plutôt que hors de la boucle modifie le temps d'exécution. Mais pour autant que j'ai pu mesurer, ce surcoût est faible par rapport au coût de la boucle elle-même (de l'ordre de 20 à 25 % du coût d'une boucle vide), et il semble fixe quels que soient le nombre et le type des variables déclarées dans le corps de la boucle.
Maintenant, en termes de lisibilité, la réponse est très claire : à l'intérieur, c'est beaucoup mieux. De manière générale, il est toujours préférable de réduire la portée d'un symbole au bloc le plus petit possible. Cela garantit -- et cela rend visible -- le fait que la variable n'est pas utilisable ailleurs. Cela réduit également le nombre d'entités que le cerveau a à mémoriser quand il décortique le code, donc cela contribue à réduire la complexité dudit code.
Alors à moins que votre fonction se résume à cette boucle, moi, je suggère de la mettre à l'intérieur.
Et n'oubliez jamais que les JVM récentes possèdent des optimiseurs dont l'efficacité est sans commune mesure avec les optimisations que vous pourriez faire au niveau source (exemple HotSpot Server).
Marsh Posté le 28-10-2002 à 15:00:58
Effectivement, c'est avant tout un pb de lisibilité, le but étant de ne déclarer une variable qui n'est connu qu'à l'intérieur de ce for. Dans les recommandations Java de Sun, je n'ai rien vu là-dessus, et comme j'ai déjà vu pas mal de code avec des déclarations dans les boucles for alors que j'avais une tendance "naturelle" à déclarer avant le for pour éviter les instanciations en série, je me suis posé la question.
Merci pour vos réponses.
Marsh Posté le 28-10-2002 à 15:08:43
De toute façon, pour une String, sauf erreur de ma part, ca revient au meme : si tu la declares avant la boucle et que tu la reinitialise au debut de chaque iteration, String etant final, il y aura de toute façon un nouvel objet créé.
Marsh Posté le 28-10-2002 à 16:00:31
R3g> Désolé de jouer les rabat-joie, mais il n'était pas question de création d'objet, mais de création de vaiable sur la pile ici...
Marsh Posté le 28-10-2002 à 16:21:56
je sais plus qui avait dit dans je sais plus quel post que le bytecode java généré était exactement le même...
Marsh Posté le 28-10-2002 à 17:15:18
J'ai créé deux progs, avec la déclaration de la variable dans et hors de la boucle. Résultat de la compilation : deux fichiers avec une taille identique. Et mieux, résultat de la décompilation : deux fichiers avec la déclaration de variable... dans la boucle.
Marsh Posté le 28-10-2002 à 17:19:46
El Scorcho a écrit a écrit : J'ai créé deux progs, avec la déclaration de la variable dans et hors de la boucle. Résultat de la compilation : deux fichiers avec une taille identique. Et mieux, résultat de la décompilation : deux fichiers avec la déclaration de variable... dans la boucle. |
...interressant ça !
jusqu'a maintenant ça me paraissait tjs plus logique de mettre les reférences en dehors de la boucle. Desormais j'arrête ça (en Java du moins !!
Marsh Posté le 28-10-2002 à 17:20:25
Ben je ne parle pas le bytecode Java couramment, mais mon désassembleur de bytecode semble confirmer tes dires, el scorcho.
Marsh Posté le 28-10-2002 à 17:31:50
El Scorcho a écrit a écrit : J'ai créé deux progs, avec la déclaration de la variable dans et hors de la boucle. Résultat de la compilation : deux fichiers avec une taille identique. Et mieux, résultat de la décompilation : deux fichiers avec la déclaration de variable... dans la boucle. |
Quel décompilateur ??? jad ? J'ai effectivement souvent remarqué ça avec lui.
Marsh Posté le 28-10-2002 à 17:47:36
Conclusion, alors ?? il vaut mieux déclarer dans les boucles for ?
Marsh Posté le 28-10-2002 à 17:52:35
_Mac_ a écrit a écrit : Quel décompilateur ??? jad ? J'ai effectivement souvent remarqué ça avec lui. |
Moi, j'utilise Jad, mais j'ai préféré l'utiliser comme désassembleur plutôt que comme décompilateur. Et le résultat semble assez probant : déplacer les déclarations hors des coprs de boucle semble n'avoir aucun effet sur le bytecode. Donc on a d'autant plus intérêt à faire primer la lisibilité.
Marsh Posté le 28-10-2002 à 18:16:36
_Mac_ a écrit a écrit : Conclusion, alors ?? il vaut mieux déclarer dans les boucles for ? |
Il vaut mieux pas se faire chier avec ça !
Donc, quand ta référence est utilisée que dans ta boucle, la déclarer ds la boucle...
Bonne idée ce topic...
Marsh Posté le 28-10-2002 à 12:12:16
Que pensez-vous de la déclaration de variables (locales) dans une boucle for ??? Par exemple, la variable temp ci-dessous :
Est-ce bien ou pas bien ? Faudrait-il plutot la déclarer avant le for ?