[Java] optimisation boucles for

optimisation boucles for [Java] - Java - Programmation

Marsh Posté le 23-01-2005 à 16:23:04    

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
Reply

Marsh Posté le 23-01-2005 à 16:23:04   

Reply

Marsh Posté le 23-01-2005 à 17:16:20    

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

Reply

Marsh Posté le 23-01-2005 à 17:18:11    

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

Reply

Marsh Posté le 23-01-2005 à 17:28:21    

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


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 23-01-2005 à 17:30:17    

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

Reply

Marsh Posté le 23-01-2005 à 17:34:34    

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
Reply

Marsh Posté le 23-01-2005 à 18:02:56    

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

Reply

Marsh Posté le 23-01-2005 à 18:20:17    

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


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 23-01-2005 à 20:02:30    

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)

Reply

Marsh Posté le 23-01-2005 à 20:43:00    

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.

Reply

Marsh Posté le 23-01-2005 à 20:43:00   

Reply

Marsh Posté le 24-01-2005 à 09:31:39    

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
Reply

Marsh Posté le 24-01-2005 à 09:32:20    

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]

Reply

Marsh Posté le 24-01-2005 à 10:22:18    

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


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 24-01-2005 à 11:10:22    

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

Marsh Posté le 24-01-2005 à 11:17:14    


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

Reply

Marsh Posté le 24-01-2005 à 11:17:57    

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.

Reply

Marsh Posté le 24-01-2005 à 12:19:29    

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)

Reply

Marsh Posté le 24-01-2005 à 12:52:41    

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}
Reply

Marsh Posté le 24-01-2005 à 13:09:48    

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
Reply

Marsh Posté le 24-01-2005 à 14:24:17    

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 ?

Reply

Marsh Posté le 24-01-2005 à 14:28:18    

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)

Reply

Marsh Posté le 24-01-2005 à 14:28:33    

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 ?
Reply

Marsh Posté le 24-01-2005 à 14:29:18    

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
Reply

Marsh Posté le 24-01-2005 à 14:31:05    

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]

Reply

Marsh Posté le 24-01-2005 à 14:35:36    

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
Reply

Marsh Posté le 24-01-2005 à 14:38:57    

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)" :)

Reply

Marsh Posté le 24-01-2005 à 14:41:46    

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 ?
Reply

Marsh Posté le 24-01-2005 à 14:46:58    

Reply

Marsh Posté le 24-01-2005 à 14:49:05    

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
Reply

Marsh Posté le 24-01-2005 à 14:54:01    

Taz a écrit :

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


dessous des strings [:kiki]

Reply

Marsh Posté le 24-01-2005 à 14:59:17    

j'en fais des cauchemards de ton topic

Reply

Marsh Posté le 24-01-2005 à 15:00:37    

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.

Reply

Marsh Posté le 25-01-2005 à 16:22:59    

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

Reply

Marsh Posté le 25-01-2005 à 16:41:06    

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}
Reply

Marsh Posté le 25-01-2005 à 17:49:28    

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

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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