Best practice Java : déclaration d'1 variable (locale) dans une boucle

Best practice Java : déclaration d'1 variable (locale) dans une boucle - Java - Programmation

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 :
 

Code :
  1. for (i = 0; i < 10; i++) {
  2.      String temp;
  3.      ...
  4. }


 
Est-ce bien ou pas bien ? Faudrait-il plutot la déclarer avant le for ?

Reply

Marsh Posté le 28-10-2002 à 12:12:16   

Reply

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...

Reply

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 :o
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.


---------------
Just because you feel good does not make you right
Reply

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...

Reply

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).

Reply

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.

Reply

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éé.


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

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...  ;)

Reply

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...

Reply

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.

Reply

Marsh Posté le 28-10-2002 à 17:15:18   

Reply

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 !!

Reply

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.


Message édité par BifaceMcLeOD le 28-10-2002 à 17:21:41
Reply

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.

Reply

Marsh Posté le 28-10-2002 à 17:44:27    

Decafe Pro 3.9

Reply

Marsh Posté le 28-10-2002 à 17:47:36    

Conclusion, alors ?? il vaut mieux déclarer dans les boucles for ?

Reply

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é.


Message édité par BifaceMcLeOD le 28-10-2002 à 17:52:51
Reply

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 ! :D
Donc, quand ta référence est utilisée que dans ta boucle, la déclarer ds la boucle...
Bonne idée ce topic...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed