Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1352 connectés 

  FORUM HardWare.fr
  Programmation
  Java

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°235827
_Mac_
Posté le 28-10-2002 à 12:12:16  profilanswer
 

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 ?

mood
Publicité
Posté le 28-10-2002 à 12:12:16  profilanswer
 

n°235828
MachinBidu​le
Posté le 28-10-2002 à 12:13:45  profilanswer
 

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

n°235829
darklord
You're welcome
Posté le 28-10-2002 à 12:14:37  profilanswer
 

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
n°235845
phenixl
Posté le 28-10-2002 à 12:57:27  profilanswer
 

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

n°235862
BifaceMcLe​OD
The HighGlandeur
Posté le 28-10-2002 à 13:55:16  profilanswer
 

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

n°235929
_Mac_
Posté le 28-10-2002 à 15:00:58  profilanswer
 

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.

n°235937
R3g
fonctionnaire certifié ITIL
Posté le 28-10-2002 à 15:08:43  profilanswer
 

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.
n°235977
BifaceMcLe​OD
The HighGlandeur
Posté le 28-10-2002 à 16:00:31  profilanswer
 

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

n°235996
benou
Posté le 28-10-2002 à 16:21:56  profilanswer
 

je sais plus qui avait dit dans je sais plus quel post que le bytecode java généré était exactement le même...

n°236059
El Scorcho
Posté le 28-10-2002 à 17:15:18  profilanswer
 

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.

mood
Publicité
Posté le 28-10-2002 à 17:15:18  profilanswer
 

n°236066
El_gringo
Posté le 28-10-2002 à 17:19:46  profilanswer
 

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

n°236067
BifaceMcLe​OD
The HighGlandeur
Posté le 28-10-2002 à 17:20:25  profilanswer
 

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
n°236070
_Mac_
Posté le 28-10-2002 à 17:31:50  profilanswer
 

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.

n°236073
El Scorcho
Posté le 28-10-2002 à 17:44:27  profilanswer
 

Decafe Pro 3.9

n°236074
_Mac_
Posté le 28-10-2002 à 17:47:36  profilanswer
 

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

n°236075
BifaceMcLe​OD
The HighGlandeur
Posté le 28-10-2002 à 17:52:35  profilanswer
 

_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
n°236104
El_gringo
Posté le 28-10-2002 à 18:16:36  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

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

 

Sujets relatifs
Devinez l'effet de cette boucle forEnvoie d'une variable avec SendData --- Besoin d'aide :(
Div et variable, placer un div en fonction d'une variable ??kel java fau ke je telecharge pour jouer les jeux de yahoo???
[JAVA] Peut on faire un lecteur mp3 en java ?Newbies en java
[JAVA] Ne pas afficher de caractères dans le champ mot-de-passe[JAVA] tri alphabétique sur String[]
mais pourquoi :( unbound variable... schemefaire tourner une video en boucle avec Tmediaplayer
Plus de sujets relatifs à : Best practice Java : déclaration d'1 variable (locale) dans une boucle


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR