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

  FORUM HardWare.fr
  Programmation
  Java

  [Java] optimisation boucles for

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Java] optimisation boucles for

n°960008
Eugenics
Posté le 23-01-2005 à 16:23:04  profilanswer
 

salut
 
simplement pour savoir votre opinion sur l'optimisation de boucles for
 
faut t'il mieux faire

Code :
  1. for(int i = 0; i < toto.longeur(); i++)
  2. ....


 
ou
 

Code :
  1. int lon_toto = toto.longeur()
  2. for(int i = 0; i < lon_toto; i++)
  3. ....


 
 
 
ou est identique niveau execution (ce que je pense)


Message édité par Eugenics le 23-01-2005 à 16:23:26
mood
Publicité
Posté le 23-01-2005 à 16:23:04  profilanswer
 

n°960046
cachalot
Demarrer-&gt;Arreter :belle philo
Posté le 23-01-2005 à 17:16:20  profilanswer
 

t'utilise juste un variable en plus dans le deuxieme cas donc bon je pense le premier mieux

n°960048
chrisbk
-
Posté le 23-01-2005 à 17:18:11  profilanswer
 

une variable, ca ne coute absolument rien, par contre dans le premier cas tu peux te manger un appel de fonction a chaque iteration

n°960063
Jubijub
Parce que je le VD bien
Posté le 23-01-2005 à 17:28:21  profilanswer
 

le compilo ou la JVM doivent surement l'optimiser d'eux meme...


---------------
Jubi Photos : Flickr - 500px
n°960064
Eugenics
Posté le 23-01-2005 à 17:30:17  profilanswer
 

ben je connais les risques , mais la question est ce que la JVM optimise le truc en ne faisant q'une fois l'appel a toto.longeur() en deduisant d'elle meme que la longeur n'est pas modifie dans la boucle  
 
si mes souvenirs sont bon en C/C++ cette optimisation est faite

n°960071
chrisbk
-
Posté le 23-01-2005 à 17:34:34  profilanswer
 

Jubijub a écrit :

le compilo ou la JVM doivent surement l'optimiser d'eux meme...


 
fo voir. Dans un cas simple comme ca la JVM doit inliner ca et ca regle le pb. Mais tu peux imaginer des cas plus compliqué avec des effets de bords et ce genre de connerie empechant une fine optimisation (meme si utiliser une fonction avec effet de bords dans une limite de boucle, c'est tres mail)

Citation :


si mes souvenirs sont bon en C/C++ cette optimisation est faite


(le compilo C++ va surtout te passer un coup d'inlining)


Message édité par chrisbk le 23-01-2005 à 17:35:11
n°960088
Eugenics
Posté le 23-01-2005 à 18:02:56  profilanswer
 

donc en conclusion je devrais lever l'inconnu en passant par une variable intermediaire ...

n°960108
Jubijub
Parce que je le VD bien
Posté le 23-01-2005 à 18:20:17  profilanswer
 

en conclusion, faudrait demander à nraynaud...lui saura...


---------------
Jubi Photos : Flickr - 500px
n°960192
chrisbk
-
Posté le 23-01-2005 à 20:02:30  profilanswer
 

Eugenics a écrit :

donc en conclusion je devrais lever l'inconnu en passant par une variable intermediaire ...


 
ou faire un bench vite fait
Cela dit c'st pas la peine de saloper ton code dans tous les cas, y'a fort a parier que ca changera rien (sauf si la fonction appelée fait vraiment tout un tas de bordel)

n°960236
the_chojin
Aucune
Posté le 23-01-2005 à 20:43:00  profilanswer
 

Honnétement j'espére bien que c'est deux boucles sont différentes : si la taille de mon tableau change dans le bloc du for, je suis bien "fait" si sa taille est sauvegardé à la rentrée dans la boucle.
Bref je vote que la premiére proposition va plus vite.

mood
Publicité
Posté le 23-01-2005 à 20:43:00  profilanswer
 

n°960431
benou
Posté le 24-01-2005 à 09:31:39  profilanswer
 

sur un tableau l'optimisation est peut être faite ... c'est pas dur de vérifier si le tableau a des chances d'être modifié (déclaration locale ou privée + non modification dans la boucle).
Par contre sur des ArrayList ou autre, ca me parait pas possible ...
 
Dans tous les cas c'est facile à vérifier : un petit coup de décompilation et hop !
 


---------------
ma vie, mon oeuvre - HomePlayer
n°960432
chrisbk
-
Posté le 24-01-2005 à 09:32:20  profilanswer
 

benou a écrit :


Dans tous les cas c'est facile à vérifier : un petit coup de décompilation et hop !


 
[:zaib3k]
Faudrait voir a pas dire n'importe quoi hein ? [:petrus75]

n°960468
benou
Posté le 24-01-2005 à 10:22:18  profilanswer
 

si t'as une précision à ajouter donne là sinon dehors [:zaib3k]


---------------
ma vie, mon oeuvre - HomePlayer
n°960505
the real m​oins moins
Posté le 24-01-2005 à 11:10:22  profilanswer
 

... c'est pas ton (dé)compilo qui va te dire si la vm fait oui ou non de l'inlining sur ta boucle... [:kiki]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°960508
chrisbk
-
Posté le 24-01-2005 à 11:17:14  profilanswer
 


benou a écrit :

si t'as une précision à ajouter donne là sinon dehors [:zaib3k]


 
attends, je fais caca dans ma culotte de trouille....voila, c'est fait [:zaib3k]
 
Alors mon petit benou, un jour que tu auras 5s de libre entre deux menaces de sanction, tu decompileras du code compilé par javac, hein ? et tu verras, sous tes yeux ébahis que javac optimise rien (*rien*, RIEN), meme pas a = 3 + 2; Alors on va pas lui demander de faire de l'inlining ou je sais pas quoi. Je sais pas si tu as lu ce topic, mais on parle a chaque d'optimisation faite par la JVM, pas par un quelconque compilo java.
Donc ta décompilation, elle va servir a rien

n°960509
Bidem
Posté le 24-01-2005 à 11:17:57  profilanswer
 

Eugenics a écrit :


Code :
  1. int lon_toto = toto.longeur()
  2. for(int i = 0; i < lon_toto; i++)
  3. ....




 
+1 pour cette solution mais il faut être absoluement sur que la longueur de toto est constante tout le long de l'exécution de la boucle.

n°960593
duchzeworl​d
Posté le 24-01-2005 à 12:19:29  profilanswer
 

D'après le lien http://www.protomatter.com/nate/java-optimization/, le mieux serait un truc du genre
 

Code :
  1. for(int i = toto.longeur()-1; --i>=0)
  2. ....


 
 

Eugenics a écrit :

salut
 
simplement pour savoir votre opinion sur l'optimisation de boucles for
 
faut t'il mieux faire

Code :
  1. for(int i = 0; i < toto.longeur(); i++)
  2. ....


 
ou
 

Code :
  1. int lon_toto = toto.longeur()
  2. for(int i = 0; i < lon_toto; i++)
  3. ....


 
 
 
ou est identique niveau execution (ce que je pense)

n°960636
sircam
I Like Trains
Posté le 24-01-2005 à 12:52:41  profilanswer
 

duchzeworld a écrit :

D'après le lien http://www.protomatter.com/nate/java-optimization/, le mieux serait un truc du genre
 

Code :
  1. for(int i = toto.longeur()-1; --i>=0)
  2. ....



[:kiki] Pas pour rendre le code lisible, en tout cas.
 
Hors de question.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°960644
Jubijub
Parce que je le VD bien
Posté le 24-01-2005 à 13:09:48  profilanswer
 

ce site propose des optimisations douteuses...le coup d'initialiser une array en jouant sur un indexOutOfBounds c très très crade...
 
je suis pas sur que le gain de perfs vaille la peine de pourrir son code à ce point...pis les exemples sont donnés en JDK 1.1 ...depuis, la JVM a du vachement murir...si une optimisation est aussi évidente à écrire que ca, je vois pas  pkoi la JVM le mettrait pas en oeuvre, vu que c super facilement automatisable, l'optimisation comme la vérification de ses conditions d'application...


---------------
Jubi Photos : Flickr - 500px
n°960722
Taz
bisounours-codeur
Posté le 24-01-2005 à 14:24:17  profilanswer
 

duchzeworld a écrit :

D'après le lien http://www.protomatter.com/nate/java-optimization/, le mieux serait un truc du genre

sans déconner le résultat du hash d'un String est pas mis en cache ?

n°960729
chrisbk
-
Posté le 24-01-2005 à 14:28:18  profilanswer
 

Taz a écrit :

sans déconner le résultat du hash d'un String est pas mis en cache ?


 
personnelement je n'accorde que peu de credit a ce qu'il y écrit, la plupart du temps c'est du branlottage (genre il te cite knuth au debut pour ensuite venir pinailler sur des index de boucle) ou sinon on sent le truc completement pas mis a jour (le paté sur les vars locales a la fin, par ex)

n°960730
the real m​oins moins
Posté le 24-01-2005 à 14:28:33  profilanswer
 

taz: bah si..

Code :
  1. /**
  2.      * Returns a hash code for this string. The hash code for a
  3.      * <code>String</code> object is computed as
  4.      * <blockquote><pre>
  5.      * s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
  6.      * </pre></blockquote>
  7.      * using <code>int</code> arithmetic, where <code>s[i]</code> is the
  8.      * <i>i</i>th character of the string, <code>n</code> is the length of
  9.      * the string, and <code>^</code> indicates exponentiation.
  10.      * (The hash value of the empty string is zero.)
  11.      *
  12.      * @return  a hash code value for this object.
  13.      */
  14.     public int hashCode() {
  15. int h = hash;
  16. if (h == 0) {
  17.     int off = offset;
  18.     char val[] = value;
  19.     int len = count;
  20.             for (int i = 0; i < len; i++) {
  21.                 h = 31*h + val[off++];
  22.             }
  23.             hash = h;
  24.         }
  25.         return h;
  26.     }


Message édité par the real moins moins le 24-01-2005 à 14:28:54

---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°960731
Taz
bisounours-codeur
Posté le 24-01-2005 à 14:29:18  profilanswer
 

d'accord, mais d'un autre côté, si c'était le cas, tu serais pas entièrement surpris ?
 
edit : ah quand même. Note que ces les dites techniques de sioux qui sont utilisées. L'algo est pas terrible lui (FNV pawa)


Message édité par Taz le 24-01-2005 à 14:31:05
n°960735
chrisbk
-
Posté le 24-01-2005 à 14:31:05  profilanswer
 

the real moins moins a écrit :

taz: bah si..

Code :
  1. /**
  2.      * Returns a hash code for this string. The hash code for a
  3.      * <code>String</code> object is computed as
  4.      * <blockquote><pre>
  5.      * s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
  6.      * </pre></blockquote>
  7.      * using <code>int</code> arithmetic, where <code>s[i]</code> is the
  8.      * <i>i</i>th character of the string, <code>n</code> is the length of
  9.      * the string, and <code>^</code> indicates exponentiation.
  10.      * (The hash value of the empty string is zero.)
  11.      *
  12.      * @return  a hash code value for this object.
  13.      */
  14.     public int hashCode() {
  15. int h = hash;
  16. if (h == 0) {
  17.     int off = offset;
  18.     char val[] = value;
  19.     int len = count;
  20.             for (int i = 0; i < len; i++) {
  21.                 h = 31*h + val[off++];
  22.             }
  23.             hash = h;
  24.         }
  25.         return h;
  26.     }



 
ah bin finalement il a peu etre raison sur le paté "variable locale", a voir comment la fonction est codée [:zaib3k]

n°960741
benou
Posté le 24-01-2005 à 14:35:36  profilanswer
 

chrisbk a écrit :

Je sais pas si tu as lu ce topic, mais on parle a chaque d'optimisation faite par la JVM, pas par un quelconque compilo java.
Donc ta décompilation, elle va servir a rien


TU parles d'optimisation faite par la JVM ...  
et chez moi le 3+2 il est transformé en 5 [:zaib3k]  
 
et tu sais, t'es pas obligé de mon tomber dessus à chacun de mes posts ...


---------------
ma vie, mon oeuvre - HomePlayer
n°960745
Taz
bisounours-codeur
Posté le 24-01-2005 à 14:38:57  profilanswer
 

benou a écrit :


et chez moi le 3+2 il est transformé en 5 [:zaib3k]  


<quake version="3>Impressive !</quake>
 
Cela dit des fois, je parle pour Java comme pour C#, c'est vrai que les compilos foutent vraiment rien et se repose sur le "le JIT va se démerder (et bien pourrir le cache entre autres)" :)

n°960746
the real m​oins moins
Posté le 24-01-2005 à 14:41:46  profilanswer
 

benou a écrit :


et tu sais, t'es pas obligé de mon tomber dessus à chacun de mes posts ...


[:calimero]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°960749
benou
Posté le 24-01-2005 à 14:46:58  profilanswer
 
n°960750
chrisbk
-
Posté le 24-01-2005 à 14:49:05  profilanswer
 

benou a écrit :

TU parles d'optimisation faite par la JVM ...  
et chez moi le 3+2 il est transformé en 5 [:zaib3k]  


 
Ah ? [:zaib3k]
 

Jubijub a écrit :

le compilo ou la JVM doivent surement l'optimiser d'eux meme...


 

Eugenics a écrit :

ben je connais les risques , mais la question est ce que la JVM optimis


 
vivi y'a que moi qui parle de la JVM [:petrus75]
et javac est bien connu pour optimiser comme un sagouin [:petrus75]
 
 
 

benou a écrit :

et chez moi le 3+2 il est transformé en 5 [:zaib3k]  


 
bon, allez, au pire je t'accorde le constant folding (en entier), mais c'est tout [:zaib3k]
 


Message édité par chrisbk le 24-01-2005 à 14:52:11
n°960755
nraynaud
lol
Posté le 24-01-2005 à 14:54:01  profilanswer
 

Taz a écrit :

sans déconner le résultat du hash d'un String est pas mis en cache ?


dessous des strings [:kiki]

n°960758
Taz
bisounours-codeur
Posté le 24-01-2005 à 14:59:17  profilanswer
 

j'en fais des cauchemards de ton topic

n°960759
nraynaud
lol
Posté le 24-01-2005 à 15:00:37  profilanswer
 

ce qui est chiant c'est qu'il ja d'abord faire une mesure de perf avant de tenter d'inliner ou de compiler, donc sur peu d'itérations, ça va réellement faire une tonne d'appels (en interprété), puis ça va inliner puis compiler.

n°962071
yolepro
Etre c'est être relatif
Posté le 25-01-2005 à 16:22:59  profilanswer
 

Il est marrant ce topic :)
 
Je comprend pas encore trop l'interet de chipoter pour une optimisation si minime. Si ce problème devait finir par être critique, c'est que la modelisation n'est pas bonne. Ou qu'il faut changer de langage et faire de l'assembleur :).

n°962086
sircam
I Like Trains
Posté le 25-01-2005 à 16:41:06  profilanswer
 

L'optimisation est sans intérêt, mais la compréhension de la machinerie sous-jacente est hautement intéressante :)


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°962169
lionelbadi​ou
Posté le 25-01-2005 à 17:49:28  profilanswer
 

Bonjour,
 
En Java, contrairement à C++, le coût d'appel d'une fonction doit être considéré comme zéro (je parle bien de l'appel pas de ce que fait la fonction). En conséquence, si toto.longueur() se contente de retourner une valeur, la première solution est la plus naturelle. Evidemment, si toto.longueur() faisait un calcul long, il serait plus intéressant de stocker le résultat (deuxième cas).
 
Par ailleurs, c'est une question largement débattue de savoir comment optimiser la déclaration d'une boucle mais...:
 
- Les développeurs du compilateur ont sûrement dû y penser eux aussi
- Le gain éventuel est souvent négligeable par rapport au temps d'éxécution de chaque itération.
 
Très cordialement,


---------------
Lionel Badiou (CodeFutures - Java Code Generation - http://www.codefutures.com )
mood
Publicité
Posté le   profilanswer
 


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

  [Java] optimisation boucles for

 

Sujets relatifs
Echec chargement d'Applet javabesoin d'aide pour executer du java
interface graphique en JAVA[java] driver jdbc Postgresql
[VBA Excel] Optimisation Import d'un énorme fichier txt[java] creer un thread qui lance des exceptions
[Java 1.5] Plantage du compilateur[PHP] doubles boucles conditionnelles
[Java] Utilisation en multiprocesseur[Java-CC] Plusieurs fichiers .jj lié -> possible ?
Plus de sujets relatifs à : [Java] optimisation boucles for


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