Les meilleurs perfs pour Java : compilation code natif, -O, -server ? - Java - Programmation
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 ;-)
Marsh Posté le 15-01-2006 à 17:04:51
sam69 a écrit : |
il doit travailler au marketting ou à la comptabilité alors.
nan mais sérieusement, c'est n'importe quoi.
Marsh Posté le 15-01-2006 à 17:33:03
Allez, donne au moins un deux exemples pour appuyer ton propos.
Marsh Posté le 15-01-2006 à 18:05:15
nraynaud a écrit : |
Bah, il a une sale tronche ok, mais son article est très interressant ! Il donne des exemples concrets d'optimisation de code java.
Marsh Posté le 15-01-2006 à 18:06:15
nraynaud a écrit : |
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
Marsh Posté le 15-01-2006 à 18:10:56
sircam a écrit : Allez, donne au moins un deux exemples pour appuyer ton propos. |
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 :
|
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
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.
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.
|
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.
Marsh Posté le 15-01-2006 à 18:42:07
nraynaud a écrit : http://java.sun.com/j2se/1.4.2/doc [...] javac.html |
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
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 ;-)
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é
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 !
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.
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 !
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!
Marsh Posté le 15-01-2006 à 20:23:32
sircam a écrit :
|
bof non, c'est vrai.
Marsh Posté le 15-01-2006 à 20:37:02
Faudra que vous me donniez votre définition du mot émulateur alors.
Marsh Posté le 15-01-2006 à 20:50:47
ha sircam, t'etais à javapolis ?
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)
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.
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 )
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"
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 ?
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 |
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é.
Marsh Posté le 15-01-2006 à 21:15:22
the real moins moins a écrit : ha sircam, t'etais à javapolis ? |
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.
Et surtout, leurs affiches deviennent d'un goût trop douteux.
Par contre, les puzzlers, miam.
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.
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.
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.
Marsh Posté le 16-01-2006 à 10:09:18
phnatomass a écrit : Je tiendrais juste à prendre la défense de l'auteur. |
tu veux dire en 96-97 non ?
Marsh Posté le 16-01-2006 à 10:15:34
nraynaud a écrit : ça émule une JVM |
Ca émule une machine physique
Marsh Posté le 16-01-2006 à 10:16:02
te doutes façon, emule c'est le piratage et c'est mal
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.
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...
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.
Marsh Posté le 16-01-2006 à 13:06:55
nraynaud pète la forme en 2006.
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 :
|
Code :
|
double sum = 0.0; // le passer en 0.0d ?
C'est des petits trucs mais bon on sait jamais ...
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.
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 ?
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 édité par sam69 le 15-01-2006 à 21:27:27