Les meilleurs perfs pour Java : compilation code natif, -O, -server ?

Les meilleurs perfs pour Java : compilation code natif, -O, -server ? - Java - Programmation

Marsh Posté le 15-01-2006 à 14:04:01    

Bonjour,
En cherchant à optimiser un programme (de calcul) en java. J'ai trouvé des liens très interressants :
 
Le premier explique comment optimiser son code : (rigolez pas sur la tête du gars, il travaille chez ibm ;-)
http://www.club-java.com/Public/Ja [...] imiser.htm
EDIT : La plupart de ses optimisations sont pipos. Sauf L'utilisation de StringBuffer !
 
Et l'autre fait une comparaison des différents mode d'exécution de programme java, (en code natif, en mode client, en mode server etc..)
http://blog.developpez.com/index.p [...] 1#more1389
EDIT : le mode "Interpreter" (que l'on obtient désormais lorsqu'on utilise l'option -Xint de Java) correspond à un mode où le bytecode est entièrement interprété sans aucune compilation natif. C'est à peu près le fonctionnement des JVM antérieur à la version 1.2 (soit avant 1998)...  
 
EDIT : Une méthode très efficace pour optimiser les perfs : regler le garbage collector correctement :
http://fivedots.coe.psu.ac.th/~ad/jg/appC/AppC.pdf
 
De même, en compilant avec javac -O, il est possible d'optimiser son code (méthode inline etc..). Ca sert vraiment à quelque chose ? Pourquoi cette option n'est pas par défaut ?
EDIT : Cette option n'est plus d'aucune utilité désormais, elle n'est plus dans la documentation de javac, bien que cela ne provoque aucune erreur lorsqu'on l'utilise (pour des raisons de compatibilité). La plupart des optimisations sont effectuées lors de l'exécution.  
 

Message cité 1 fois
Message édité par sam69 le 15-01-2006 à 21:27:27
Reply

Marsh Posté le 15-01-2006 à 14:04:01   

Reply

Marsh Posté le 15-01-2006 à 15:53:42    

Un petit up pour que les experts java puissent lire ce message !
Je sais, on est dimanche donc je suis patient ;-)

Reply

Marsh Posté le 15-01-2006 à 17:04:51    

sam69 a écrit :


Le premier explique comment optimiser son code : (rigolez pas sur la tête du gars, il travaille chez ibm ;-)
http://www.club-java.com/Public/Ja [...] imiser.htm


[:rofl]
il doit travailler au marketting ou à la comptabilité alors.
 
nan mais sérieusement, c'est n'importe quoi.

Reply

Marsh Posté le 15-01-2006 à 17:33:03    

Allez, donne au moins un deux exemples pour appuyer ton propos. [:pingouino]
 


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 15-01-2006 à 18:05:15    

nraynaud a écrit :

[:rofl]
il doit travailler au marketting ou à la comptabilité alors.
 
nan mais sérieusement, c'est n'importe quoi.


 
Bah, il a une sale tronche ok, mais son article est très interressant ! Il donne des exemples concrets d'optimisation de code java.

Reply

Marsh Posté le 15-01-2006 à 18:06:15    

nraynaud a écrit :

[:rofl]
il doit travailler au marketting ou à la comptabilité alors.
 
nan mais sérieusement, c'est n'importe quoi.


 
j'ai parcourcu un petit peu le lien. ce qu'il y a dedans ne me parait pas idiot, mais avoir d'autres avis, ca m'intéresse aussi, je suis preneur :)


---------------
TReVoR - http://dev.arqendra.net - http://info.arqendra.net
Reply

Marsh Posté le 15-01-2006 à 18:10:56    

sircam a écrit :

Allez, donne au moins un deux exemples pour appuyer ton propos. [:pingouino]


 
C'est pas des propos que je donne, ce sont des questions. A ceux qui ont déjà éxecuté des programmes java en mode server, qui permet d'optimiser la vitesse de programmes java en fonction de la machine cible.
Un exemple tiré du deuxième lien :  
 

Code :
  1. for (int i=0; i<max; i++) {
  2.     integer = new Integer(i);
  3. }


 
Java Interpreter 36,750 s
Java 5.0 Server 1,265 s
GCJ 3.4.4 -O3 18,937 s
 
Cela veut dire que ce programme met 36 secondes à s'exécuter en mode normal, alors qu'en mode server avec le jdk 1.5, il ne met que 1 s !!
 
Merci d'avance à ceux qui pourrons m'expliquer comment executer un programme en mode server  :jap:

Reply

Marsh Posté le 15-01-2006 à 18:21:35    

http://java.sun.com/j2se/1.4.2/doc [...] javac.html
vous en voyez beaucoup des -O ?
 
réutiliser les instance -> dans la plupart des cas, le code pour gérer le pool est plus lent qu'un constructeur (j'ai plus l'article sous la main)
 
 
les histoires de dispatching (static, final etc.) -> ça se fait tout seul à la compil, élimination des expressions comunes pareil (mais c'est bien de le faire quand même), l'histoire des boucles à l'envers : pipo, si elle le veut, la JVM se démerdera (mais y'a sûrement pas de mot d'état dans la JVM). Les histoires de remplacement de /2 par >> d'une part la JVM le fait, d'autre part, le proc peut le faire.
 
etc. etc.
 
les perfs ça s'améliore par les algorithmes, pas par de la bidouille.

Reply

Marsh Posté le 15-01-2006 à 18:22:54    

sam69 a écrit :

C'est pas des propos que je donne, ce sont des questions. A ceux qui ont déjà éxecuté des programmes java en mode server, qui permet d'optimiser la vitesse de programmes java en fonction de la machine cible.
Un exemple tiré du deuxième lien :  
 

Code :
  1. for (int i=0; i<max; i++) {
  2.     integer = new Integer(i);
  3. }


 
Java Interpreter 36,750 s
Java 5.0 Server 1,265 s
GCJ 3.4.4 -O3 18,937 s
 
Cela veut dire que ce programme met 36 secondes à s'exécuter en mode normal, alors qu'en mode server avec le jdk 1.5, il ne met que 1 s !!
 
Merci d'avance à ceux qui pourrons m'expliquer comment executer un programme en mode server  :jap:


normalement, c'est -server.
 
en mode server, il compile tout agressivement, alors qu'en mode client il évite pour pas que d'un e part l'utilisateur attende trop et d'autre paart parce que les profils de charge peuvent changer très vite.

Reply

Marsh Posté le 15-01-2006 à 18:42:07    

nraynaud a écrit :

http://java.sun.com/j2se/1.4.2/doc [...] javac.html
vous en voyez beaucoup des -O ?
 
réutiliser les instance -> dans la plupart des cas, le code pour gérer le pool est plus lent qu'un constructeur (j'ai plus l'article sous la main)
 
 
les histoires de dispatching (static, final etc.) -> ça se fait tout seul à la compil, élimination des expressions comunes pareil (mais c'est bien de le faire quand même), l'histoire des boucles à l'envers : pipo, si elle le veut, la JVM se démerdera (mais y'a sûrement pas de mot d'état dans la JVM). Les histoires de remplacement de /2 par >> d'une part la JVM le fait, d'autre part, le proc peut le faire.
 
etc. etc.
 
les perfs ça s'améliore par les algorithmes, pas par de la bidouille.


 
Bon, peut-être que tout n'est pas bon à prendre dans cet article, car c'est bien vrai que certaines bidouilles ne doivent pas changer grand chose, excepté de rendre le code illisible  :D  
 
Sinon, je pense que l'option -server est plus interressante dans mon cas. Je viens de trouver comment lancer un programme en passant l'argument -server à la machine virtuelle :  
Dans Eclipse, Run...->Arguments->VM Arguments : ajouter -server
 
Si vous avez l'erreur Error: no `server' JVM at `C:\Program Files\Java\jre1.5.0_06\bin\server\jvm.dll, il faut copier le répertoire bin\server qui doit se trouver dans le jdk (oui je sais, j'avais installé le jre avant le jdk..)
 
Il faut que je fasse des tests pour voir les changements !! Car dans mon cas, c'est un programme qui fait des calculs brut (et souvent les mêmes) donc je pense que ca va aider ;-)


Message édité par sam69 le 15-01-2006 à 18:48:58
Reply

Marsh Posté le 15-01-2006 à 18:42:07   

Reply

Marsh Posté le 15-01-2006 à 18:42:40    

Ce qui me fait souvent rire qd on voit des bench java ou on voit des langages compilés (ex: C) se faire depassé par ce dernier (soit disant parce que l'interpreteur sait sur quel cpu il execute, ce qui n'est pa le cas dans un langage compilé)
 
quoi qu'on puisse dire pour moi Java ne sera jamais qu'un emulateur optimisé :o

Reply

Marsh Posté le 15-01-2006 à 18:50:35    

On va pas partir sur le débat "java c'est lent, programmez en c++" please !

Reply

Marsh Posté le 15-01-2006 à 18:57:44    

red faction a écrit :

(soit disant parce que l'interpreteur sait sur quel cpu il execute, ce qui n'est pa le cas dans un langage compilé)


ben celui qui t'a dit ça, il t'a bourré le mou.

Reply

Marsh Posté le 15-01-2006 à 20:01:09    

Citation :

C'est pas des propos que je donne, ce sont des questions.


"Allez, donne au moins un deux exemples pour appuyer ton propos" ne t'était pas adressé.

Citation :

vous en voyez beaucoup des -O ?


OK.

Citation :

réutiliser les instance -> dans la plupart des cas, le code pour gérer le pool est plus lent qu'un constructeur


OK; somme toute "logique".

Citation :

les histoires de dispatching (static, final etc.) -> ça se fait tout seul à la compil, élimination des expressions comunes pareil


OK

Citation :

l'histoire des boucles à l'envers : pipo


Tu l'as dit!

Citation :

Les histoires de remplacement de /2 par >>


Non mais là, carrément. Bloch et Gafter doivent trouver ce genre de pseudo-optimisations bien marrantes. Ils ont d'ailleurs fait un clin d'oeil à cette soi-disant optimisation lors de leur "puzzlers" à Javapolis, cela dit en passant.

Citation :

les perfs ça s'améliore par les algorithmes, pas par de la bidouille.


+1 : Tout ça, ce sont des micro-optimisations tout droit venue du C et qui n'ont plus vraiment leur place au sein d'une machine virtuelle moderne.

Citation :

quoi qu'on puisse dire pour moi Java ne sera jamais qu'un emulateur optimisé


Non mais ninwak ! :o


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 15-01-2006 à 20:07:56    

ok. bon aux vues des commentaires des connaisseurs, je vire le lien "optimisez java" de mes signets! :)


---------------
TReVoR - http://dev.arqendra.net - http://info.arqendra.net
Reply

Marsh Posté le 15-01-2006 à 20:23:32    

sircam a écrit :


Citation :

quoi qu'on puisse dire pour moi Java ne sera jamais qu'un emulateur optimisé


Non mais ninwak ! :o


bof non, c'est vrai.

Reply

Marsh Posté le 15-01-2006 à 20:37:02    

Faudra que vous me donniez votre définition du mot émulateur alors. [:pingouino]


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 15-01-2006 à 20:45:14    

ça émule une JVM :o

Reply

Marsh Posté le 15-01-2006 à 20:50:47    

ha sircam, t'etais à javapolis ? :D


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 15-01-2006 à 20:52:09    

programme qui (en temps reel) interprete du bytecode et le traduit en langague machine (et qui forcement est plus lent que si le code avec ete executé directement par le proco)
 
 

Reply

Marsh Posté le 15-01-2006 à 20:58:40    

red faction a écrit :

programme qui (en temps reel) interprete du bytecode et le traduit en langague machine (et qui forcement est plus lent que si le code avec ete executé directement par le proco)


1) c'est pas en temps réel
2) ça lui permet de changer de stratégie de compilation si la stratéie initiale n'était pas efficace
3) ça lui donne une visibilité plus fine qu'un compilateur statique.
 
y'as des arguments contre, mais je compte sur toi pour aller les trouver.

Reply

Marsh Posté le 15-01-2006 à 21:04:29    

qd j'ai mit "en temps reel" je voulais simplement dire que ce n'etait pas un simple utilitaire qui prenait un fichier binaire en entree et recrachait un .exe en sortie  
 
bien evidement que java ne fait pas ca pour chaque opcode (et c la meme chose pour certains emu )

Reply

Marsh Posté le 15-01-2006 à 21:05:42    

oui mais c'est là que ça change tout par rapport à : "et qui est forcément plus lent"

Reply

Marsh Posté le 15-01-2006 à 21:08:33    

ok grace a la compilation dynamique je peux comprendre que l'on puisse obtenir des performances semblables, mais Alors il faudrait mexpliquer pq NetBeans par exemple rame exagérement par rapport a d'autre IDE, alors que il est ecrit lui aussi en Java
(si jte parle de NetBeans c'est parce que c'est un des seul soft que j'ai eu reelement a utliser en Java a fond)
 
et pq ne fait on pas tout les jeux en Java alors s'il est si peu gourmand ?

Message cité 1 fois
Message édité par red faction le 15-01-2006 à 21:12:16
Reply

Marsh Posté le 15-01-2006 à 21:13:26    

red faction a écrit :

ok grace a la compilation dynamique je peut comprendre que l'on puisse obtenir des performances semblables, mais Alors il faudrait mexpliquer pq NetBeans par exemple rame exagérement par rapport a d'autre IDE, alors que il est ecrit lui aussi en Java
 
 
et pq ne fait on pas tout les jeux en Java alors s'il est si peu gourmand ?


1) y'a de la merde partout, et java semble particulièrement attirer les merdeux
 
 
2) deux point :
- java n'a pas une bonne image
- le GC (actuel) ne permet pas de s'approcher facilement du temps réel. Et développer des JVM spécifique est compliqué et manque de marché.
 

Reply

Marsh Posté le 15-01-2006 à 21:15:22    

the real moins moins a écrit :

ha sircam, t'etais à javapolis ? :D


Ouaip, par intermitence. Je pense pas que j'y retournerai l'année prochaine : Java commence à avoir un goût de legacy à Javapolis. Pas mal de choses qui se répètent finalement.    [:pingouino]
 
Et surtout, leurs affiches deviennent d'un goût trop douteux. [:dawa]
 
Par contre, les puzzlers, miam.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 15-01-2006 à 21:21:40    

Merci beaucoup à tous pour vos réponses !
J'ai trouvé d'autres informations/désinformation : Je met à jour mon premier poste.

Reply

Marsh Posté le 16-01-2006 à 09:25:58    

Je tiendrais juste à prendre la défense de l'auteur.
C'est un article qui date d'au moins 99/2000 si mes souvenirs sont exacts.
Les compilateurs et jre java ont extrement progessés depuis le jdk1.2.
Certaine optimisations n'ont plus lieu d'être aujourd'hui mais pourtant à l'époque la réutilisation d'instance était un gain substantielle, de même qu'avec de simple bench on constatait la difference réelle qu'il y avait entre appels de methodes static et methodes non static.

Reply

Marsh Posté le 16-01-2006 à 09:27:28    

Remarque constructive et fondée.
 
L'auteur pourrait au moins mettre un cachet "deprecated" sur l'article.
 
[:pingouino]


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 16-01-2006 à 10:09:18    

phnatomass a écrit :

Je tiendrais juste à prendre la défense de l'auteur.
C'est un article qui date d'au moins 99/2000 si mes souvenirs sont exacts.
Les compilateurs et jre java ont extrement progessés depuis le jdk1.2.
Certaine optimisations n'ont plus lieu d'être aujourd'hui mais pourtant à l'époque la réutilisation d'instance était un gain substantielle, de même qu'avec de simple bench on constatait la difference réelle qu'il y avait entre appels de methodes static et methodes non static.


tu veux dire en 96-97 non ?

Reply

Marsh Posté le 16-01-2006 à 10:15:34    

nraynaud a écrit :

ça émule une JVM :o


Ca émule une machine physique [:aloy]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 16-01-2006 à 10:16:02    

te doutes façon, emule c'est le piratage et c'est mal :o


Message édité par nraynaud le 16-01-2006 à 10:16:09
Reply

Marsh Posté le 16-01-2006 à 10:57:34    

nraynaud a écrit :

tu veux dire en 96-97 non ?


Ecris à l'auteur si tu souhaites savoir quand il a pondu son article, mais en jdk1.2 (donc 99-2000) la plupart de ses tips étaient valables.

Reply

Marsh Posté le 16-01-2006 à 12:17:39    

nraynaud a écrit :

les perfs ça s'améliore par les algorithmes, pas par de la bidouille.


 
certes... mais une fois que l'algorithme a été optimisé, il faut se pencher sur la configuration de la JVM, et ce n'est pas de la bidouille. Changer de garbage collector sur un quadri processeur c'est obligatoire par exemple, j'appelle pas ca de la bidouille...

Reply

Marsh Posté le 16-01-2006 à 12:23:24    

_guigui_ a écrit :

certes... mais une fois que l'algorithme a été optimisé, il faut se pencher sur la configuration de la JVM, et ce n'est pas de la bidouille. Changer de garbage collector sur un quadri processeur c'est obligatoire par exemple, j'appelle pas ca de la bidouille...


ouais, bah déjà, que l'algo soit optimisé hein.
 
Parce que pour l'instant, j'attends encore d'en voir du code optimisé.
 
 
parce que les mecs qui me gonflent avec ses >> alors qu'il a jamais vu un profiler de sa vie, ça va 5 min.

Reply

Marsh Posté le 16-01-2006 à 13:06:55    

nraynaud pète la forme en 2006.
 
[:pingouino]


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 16-01-2006 à 13:11:22    

Yeah man ! BRETELLES attitude man !

Reply

Marsh Posté le 30-04-2006 à 19:17:50    

Yo,
 
   Désolé pour le ce up de l'enfer mais je suis dans les optis la et j'aimerais des avis de votre part. J'ai un peu la flemme de faire du javap ....  
 

Code :
  1. for (int j = 1; j <= this.numberOfColumns; j++) {
  2.             sum_field += (r[j] * r[j]); //sum_field = sum_field + (r[j] * r[j]);   <---  ca sert ou pas ?
  3. }

 
 

Code :
  1. int j, k, temp; <-------------- le k etait déclaré a chaque iteration de la premiere boucle
  2.         double sum;
  3.         for (j = 1; j <= this.numberOfRows; j++) {
  4.             sum = 0.0d; //double sum = 0.; <------------------------------- ca sert ou pas ?
  5.             temp = (rowstr[j + 1] - 1); // added    <------------------------ ca sert ou pas de le sortir du test de la boucle ?
  6.             for (k = rowstr[j]; k <= temp; k++) {
  7.                 sum += (a[k] * p[colidx[k]]);// sum = sum + (a[k] * p[colidx[k]]);
  8.             }
  9.             w[j] = sum;
  10.         }


 
double sum = 0.0;   // le passer en   0.0d   ?
 
C'est des petits trucs mais bon  on sait jamais ...


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 30-04-2006 à 19:45:44    

c'est inutile.  
 
par contre, fais gaffe que dans le premier cas, si sum>>r[j] * r[j]
et dans le second, si sum >> (a[k] * p[colidx[k]]) alors tu perds de la précision à chaque tour de boucle.


Message édité par nraynaud le 30-04-2006 à 19:46:34
Reply

Marsh Posté le 04-05-2006 à 21:51:41    

Sinon pour être en mode serveur il faut remplir les conditions suivantes; avoir 2 CPU (ou un double coeur) et 2 giga de ram. Dans ce cas tu es automatiquement en mode serveur, hé bien moi j'y suis pas, il manque une dll, peut être devrais je réinstaller le JDK maintenant que j'ai un X2 ?

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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