|
Publicité ' | ||||||||||||||||||||||||
|
|
#81 | |
|
Invité régulier
![]() Inscription : janvier 2003 Messages : 14 ![]() |
Citation:
|
|
|
|
00
|
|
|
#82 |
|
Futur Membre du Club
![]() Développeur Java Inscription : janvier 2003 Messages : 17 ![]() |
Je pense pour ma part que la rapidité d'execution sera de moins en moins un problème, (avec la puissance croissante des ordinateurs et les améliorations nombreuses apportées au JRE et au langage lui même).
Aujourd'hui il plus d'actualité de confronter JAVA à C# par exemple, puisque le fond de commerce des deux est l'informatique distribuée et les services Web. Pour les applications classiques, pas de problème il faut apprendre le C/C++ car des jeux, applications multimedia en JAVA ce n'est surement pas pour demain. |
|
00
|
|
|
#83 | ||||||||||||
|
Membre du Club
![]() Inscription : janvier 2003 Messages : 26 ![]() |
Citation:
Ce n'est pas cool de pinailler. Le fait qu'une problème soit reporté comme une erreur ou un avertissement depend simplement des options de compilation, c-a-d des souhaits de l'utilisateur. On peut transformer le warning gcc en erreur baveuse (option -pedantic-errors la bien nommée), ou même n'avoir aucun rapport d'erreur si on le désire. Ca n'a pas grand chose à voir avec le langage. Ce qui est important c'est que la sémantique du langage fasse que le compilateur puisse détecter un problème. javac dit "problème potentiel" (il a raison, ce n'est pas forcément un problème) et gcc dit "attention, assignation d'un double à un int", après c'est au programmeur de prendre ses responsabilités. Pour la suite de ton intervention, je suis perplexe car int i = (int) 0.5f ; est exactement ce qu'on *pourrait* écrire aussi en C++ pour être clean avec le compilo. Pour cet exemple précis, je parlerais d'ailleurs plutôt de conversion, car un "int" n'est pas un objet en Java(1)(2) (pas plus qu'en C++ d'ailleurs). On ne peut donc pas parler de relation "est-un" (qui est modélisé par l'héritage en programmation objet). On a plutôt une relation "peut-etre-converti-en" dans les deux langages avec des garde-fous pour éviter de convertir n'importe quoi en n'importe quoi. C++ propose d'ailleurs la conversion static_cast<Type_cible>(expression) servant (je cite) aux "conversions bien définies, mais non-sûres". Comme nous sommes en plein dans ce cas, ton exemple s'écrirait proprement int i = static_cast<int>( 0.5f ) ; en C++, ce qui est plus précis que la version Java. On dispose aussi de reinterpret_cast, const_cast et dynamic_cast pour préciser explicitement ses intentions lors d'un conversion. Donc, cher contradicteur, je me permet de nuancer vos affirmations. (1) Ceci montre d'ailleurs que la réclame "Java est 100% objet" n'engage que ceux qui la croient. (2) J'irai plus loin : un String n'est pas un objet non plus, c'est un être hybride qui a certaines propriétés des objets et des types natifs. ------ Citation:
1) p1+p2 n'a pas de sens physique (somme de 2 adresses) et ne compile même pas. 2) p1-p2 a un sens mais n'est pas un pointeur, c'est un entier (nombre d'éléments entre les deux adresses) 3) seul, p1+1 est bien un pointeur. Dans ces conditions on comprend pourquoi la mémoire est accédée n'importe comment. Citation:
je veux simplement dire que - c'est une porte ouverte à la bidouille - sa présence témoigne de la volonté de combler des faiblesses. Je pense que Sun devrait s'abstenir de ce genre de chose qui ne peut que les décrédibiliser, mais je n'ai pas étudié le package d'assez près pour être catégorique. Je constate que, toi aussi, tu as un doute sur la sécurité de la chose. ------ Citation:
De toute façon, un code générique non instancié ne risque pas plus de générer un erreur d'exécution qu'un programme pas encore écrit. Citation:
il y a quelques années qui proclamait haut et fort que les templates ne servaient à rien en java puisqu'on pouvait fourrer n'importe quel objet dans un conteneur. Citation:
Un langage extensible est un langage dans lequel ce que tu développes ne peut pas être distingué de ce qui existait avant. Un exemple frappant est FORTH : tu peux tout redéfinir (même les structures de contrôle en étant habile), et tout ce que tu as développé s'utilise comme du natif. LISP est un autre exemple, mais ces deux langages ont en commun une syntaxe extrêmement frustre, et d'autres caractéristiques ce qui en limitent l'usage. En ce qui concerne C++, les types que tu peux définir s'utilisent exactement comme les types natifs (même syntaxe, même façon de les passer en paramètres, interface pouvant être basée sur des opérateurs, etc.) Leurs performances sont également très proches (tu vois que les perf, dans la vie, ça sert, même si il n'y a pas que ça -effectivement-) C++ permet également de définir des opérateurs de conversion, etc. Tout ceci fait que les types que tu définis sont absolument indiscernables des types natifs. L'extensibilité c'est ça, et Java ne le fait pas. L'extensibilité, c'est aussi de pouvoir implémenter facilement des fonctionalités qui nécessiteraient autrement une modification des structure de contrôle du langage. Par exemple, C++ utilise un concept tout simple, mais très utile : le destructeur. Regardes de près Jthreads++ et tu verra qu'il est utilisé pour implémenter les sections critiques (synchronized en Java). Voila un concept qui a été écarté dans la conception de Java, et qui pourtant remplace a lui seul synchronized, finalize() et finally. Pas mal pour un truc qui ne sert a rien. (Voir dans les post antérieurs mes interventions à ce sujet). L'extensibilité, c'est ça et Java ne le permet pas. L'extensibilité, c'est aussi que les extensions n'épuisent pas le programmeur qui les utilise et la machine qui les exécute. Lorque je vois les sinistres bidouilles qu'il faut faire pour donner à un "int" une très vague sémantique objet, je pleure : conversion en int->Integer, puis Integer->int pour la moindre opération, puis retour en Integer, et vlan, la JVM pédale à chaque conversion ! L'extensibilité, c'est ça et Java ne l'offre pas. Citation:
Il s'agit de mise en oeuvre d'un concept qui existaient et avait été implémenté bien avant. Le nom Jthreads++ est un nom "commercial" qui rappelle que les fontionnalités sont identiques et c'est tout. J'ai fait pendant longtemps des threads en C (pas C++) : c'était beaucoup moins commode qu'en Java, mais ça marchait. Il se trouve qu'en C++, c'est aussi commode et qu'il n'y a pas eu besoin pour cela de modifier le langage. Citation:
mais d'ou sortent les 80 à 100% si tu n'as pas essayé ? De toute façon le problème réel est ci-dessous. Citation:
elle n'est pas réalisée *avec* JNI; c'est plus qu'une nuance, ça n'a rien à voir. Ce que je supposais se vérifie donc, ton appli exécute du code natif (en proportion inconnue). Le temps que tu as mesuré ne concerne donc pas du code Java mais du code C ou C++ encapsulé par une surchouche Java. En fait, c'est même peut-être plus compliqué si des opérations sont faites par hardware. Je trouve assez fort, et carrément non scientifique de prétendre mesurer la rapidité d'un langage de cette manière (c-a-d en exécutant du code écrit dans un autre langage) Par exemple: (et ce n'est qu'un exemple car je ne connais pas les chiffres réels) Supposons que dans une appli C++ utilisant OpenGL, 90% du temps soit consommé par openGL et 10% ailleurs (ça me semble être une hypothèse minimale puisque tu dis que TOUS les calculs sont faits par openGL.) Sur 100s on passe donc 90s en OpenGL 10s ailleurs. Recodons la partie non openGL en Java et *supposons* que celle ci soit 5 fois plus lente on obtient donc 90s en OpenGL 50s ailleurs, soit 140s c-a-d seulement 1,4 fois le temps initial ce qui est en contradiction avec notre hypothèse de départ (5 fois). Ce type de test ne mesure donc absolument pas les perf du langage. On va me rétorquer qu'on en a rien à faire puisque, de toute façon on récupère bien 80à90% des perf du C++ pur. Manque de pot, on à perdu au passage tout ce qui fait l'intérêt de Java a) la simplicité puisqu'on est obligé de se prendre la tête avec des optimisations, des accès direct à je ne sais quoi, des transformations de tables Java en tables natives, etc. b) le programme n'a plus l'universalité que devrait fournir la JVM, puisque tu dois fournir les bibli openGL (DLL ou .so) pour qu'il tourne. Il se trouve exactement dans la même situation que n'importe quel programme compilé, en C++ ou autre, ce qui fait s'effondrer tout le modèle java. Vrai ou faux ? Je crois qu'il ne faut pas avancer comme cela des chiffres qui, si ils ne sont pas faux en eux mêmes, ne représentent pas ce qu'ils sont censés représenter. Je pense sincérement qu'ils ont été pris pour argent comptant et contribuent à alimenter la rumeur. |
||||||||||||
|
|
10
|
|
|
#84 | |||||||||||||||||||||||||||||||
![]() ![]() Inscription : janvier 2003 Messages : 285 ![]() |
C++
Code :
JAVA Code :
f(0,0.5); ^ 1 error Citation:
Citation:
Citation:
Citation:
Citation:
Citation:
D'ailleurs puisque qu'on en viens aux cast du c++, bravo on peut par faire de programmation plus dégueulase que ca (transformer des constantes en variables, etC... Citation:
Citation:
Mais si seulement ca s'arrêtait la, mais non! c++ dispose des opérateurs conversion implicite (avec les constructeurs), Ce qui représente un source de bug perfide pour le non initié puisque le compilateur effectue les transtypage dans votre dos!! OK la parade est d'utiliser le mot-clé "explicit". (Voir le cours c++ pour les pros par Bruno Garcia sur ce site) Bref C++ permet bcp de chose par défaut et la seule solution est de connaitre à 100% le langage pour éviter les conneries. Et pour la maintenance d'un programme, prions pour que le programmeur suivant sache aussi bien manipuler le langage. Citation:
Citation:
Moi j'en connais un d'être hybride, c'est le c++ TOUT ENTIER. Et puis ne dit pas type natif en java, on va te lancer des pierres... dit plutot type primitif car contrairement à c++, les types ne sont pas natifs mais portables (char c'est de l'unicode 16 bit par ex, int c'est 32bits tt le temps, etc...) Citation:
Citation:
Citation:
Citation:
Citation:
"Ceci est en contradiction avec le typage statique fort qui garantit la sureté du code en Java" Citation:
Autant partager au bénéfice de chacun. Ce que je vois, c'est que les templates sont une bonne chose. point barre, on va pas tergiverser la dessus plus longtemps. Citation:
Citation:
Citation:
Citation:
Citation:
La facon dont Jthreads++ gère les threads est une réplique de java : synchronized comme moniteur, wait, notify pour la communication entre threads. D'ou l'influence positive de java sur cette librairie. Citation:
Citation:
Tu voudrais réécrire opengl en java? réfléchit ca n'a aucun sens. A moins que les cartes graphiques embarque un machine virtuelle. argh! Citation:
Citation:
Citation:
Citation:
En plus je te signale que dans une appli graphique, on mesure le temps de calcul par frame. Opengl travaille en parallèle avec ton application. Pdt qu'opengl se débrouille avec les polygones, toi tu peux faire des calculs d'IA, etc... Au final ca sert à quoi le c++? à avoir plus de temps libre pour ne rien faire? Enfin, tout ce qu'on peut dire sur java n'est qu'une accumulation de pinaillage hein, donc j'arrête la, et j'invite les personnes à lire l'excellente FAQ java disponible sur ce site, de même que les cours sur c++ et java (dont certains sous écrits par Ours Blanc Des carpathes alias Bruno Garcia, professeur fabuleux à l'isima, paix à son âme). |
|||||||||||||||||||||||||||||||
|
|
01
|
|
|
#85 | |||||||
|
Membre du Club
![]() Inscription : janvier 2003 Messages : 26 ![]() |
Citation:
de choses étaient devenues "deprecated". Mais enfin, voici: Comme certains ont l'air intéressés, et comme proposé, voici un petit code qui permet de vérifier ce que j'avance à propos des vitesses respectives de Java et C++. Préambule --------- Ce code ne fait appel aucune bibli (graphique ou autres) qui perturberait la mesure car rédigée dans un autre langage. Je me suis longuement expliqué sur ceci dans mon dernier post. J'ai essayé de réaliser un équilibre en mettant en oeuvre - des types natifs (int, double) - des types définis par l'utilisateur (on y trouve 2 classes) - des conteneurs livrés avec le langage (vector/Vector est le plus courant) Conditions expérimentales ------------------------- -J'ai sur mon bureau un P3 1GHz, sous Linux (Mandrake 9) 256Mb de ram -Le compilateur Java est celui du JDK 1.3 de Sun, la JVM est aussi celle du JDK. -Le compilateur C++ est gcc version 3.2 livré avec la distrib Mandrake 9.0 Les options de compilation sont: java : aucune (celles que j'ai essayé n'améliorent pas les perf) gcc : -Wall -O1 -Wall sert juste à demander tous les warnings, et -O1 correspond à une optimisation "standard". Elle fait toutefois un boulot énorme et sa présence est capitale. Ces deux outils ne sont pas les plus performants dans leurs créneaux respectifs, mais ils sont sérieux et font référence. (En ce qui concerne Java qui n'est pas normalisé, l'implémentation de Sun est d'ailleurs la seule référence possible). Que fait le programme ? ----------------------- Un calcul géométrique très courant en C.A.O. Il calcule répétitivement l'aire d'un polygone plan (non croisé) défini dans l'espace par des points. Sommairement décrit, cet algo fait une somme de produits vectoriels. Les vecteurs utilisés sont calculés à partir des sommets du polygone, et on les obtient (en gros) en faisant la différences des vecteurs de position des sommets. Le résultat cherché (aire) est la moitié de norme du vecteur somme. On fait donc d'un point de vue purement calculatoire -des soustraction / additions de doubles (calcul de vecteurs) -des produits de doubles (produit vectoriels) -une racine carrée. Les données d'entrée sont lues dans un fichier (essai.pol) et les résultat sont affichés à l'écran. Le programme gère lui-même son chronometrage. Le chronométrage commence après la lecture du fichier de données et s'achève à l'affichage des résultats. Le chronométrage ne commence qu'après le lancement du programme, ce qui est à priori favorable au programme Java, car on élimine ainsi le temps de chargement et de mise en route de la JVM, qui ne sont donc pas pris en compte. Modélisation objet ------------------ L'identification des concepts indique que l'on manipule -des points dans l'espace (plus exactement des vecteurs de position) -des polygones Les classes développées correspondent exactement à cette analyse. Une classe annexe "application" a été developpée en C++ pour être conforme à l'esprit objet et une classe "FormattedIStream" en Java pour faciliter la lecture du fichier de données. ****** Je réclame aux spécialistes de Java une solution permettant de se passer de cette classe. ****** Aucune de ces deux classes ne participe ni n'influe de manière perceptible sur les performances. Grands principes ---------------- Les deux codes sont écrits selon les mêmes principes, avec les éléments que les langages proposent. Le modèle objet est exactement le même et j'ai essayé d'être loyal (par exemple, j'ai essayé de limiter le nombre de variables intermédiaires au minimim dans les deux cas) Si quelque chose ne vous parait pas conforme à ce principe, signalez-le. En outre, j'ai essayé de trouver la programmation la plus performante, sans céder à la bidouille. Vous verrez que la méthode Polygone.aire comporte un code en commentaire qui est significativement moins performant que celui qui a été retenu (mais plus facile à comprendre). Le code Java est réparti en 4 fichiers, le code C++ est dans un seul fichier. L'appli est suffisamment petite pour que ce soit plus simple comme ça, et ca vous permettra de compiler/linker en une seule commande. Je recommande sous linux. gcc -o aire -O1 -Wall aire.cpp -lstdc++ Pour java javac *.java java aire devrait le faire. ====================CODE JAVA======================================== Code :
CODE C++ Code :
donc on doit obtenir une aire de 100 unités-carré. Remarques sur le code --------------------- Le code C++ est beaucoup plus court (250 lignes contre 315), en partie à cause de la classe FormattedIStream. Je n'ai pratiquement pas mis de commentaires dans le code Java, un peu dans le code C++. Je pense qu'ils sont tous les deux faciles à comprendre, mais le code C++ est plus élégant grâce à l'usage d'opérateurs. (Voir par exemple la fonction qui calcule l'aire) Bien que ceci ne soit pas un soft de production mais juste de démonstration j'ai envie qu'il soit correct. Vous êtes donc invités à me signaler d'éventuels bugs ou maladresses. Les E/S ont été écrites assez rapidement, et utilisent davantage les exceptions en Java qu'en C++. Ceci est du au fait qu'il est traditionnel de récuperer les erreur de lecture en C++ sans exceptions, alors que c'est le contraire en Java. Pour montrer que ça ne pose pas de problème, la classe C++ polygone lance une erreur de lecture si la lecture du polygone echoue. Je ne me suis pas concentré sur ce point, qui est pour l'instant hors-sujet. Le programme C++ fonctionne à l'identique en remplaçant vector par list, grâce à l'utilisation des itérateurs. Je suppose qu'il en va de même en Java mais je n'ai pas vérifié. Qui veut le faire ? Résultats --------- Java: 10000000 (10 puissance 7 ) polygones à 4 sommets en 24 secondes C++: 100000000 (10 puissance 8 ) polygones à 4 sommets en 20 secondes (J'ai été obligé de multiplier le nb d'itérations par 10 pour avoir plus de précision). On à donc un rapport de 24/2 = 12 Ceci est conforme (et au delà) à ce que j'avais annoncé, puisque j'ai parlé d'un rapport 10. Je suis conscient que selon les outils, on peut avoir des résultats différents, mais ils devraient rester du même ordre. Je me suis également intéressé au comportement du programme lorsque le nombre de points du polygone augmente. Voici le résultat en secondes. (j'ai ramené a 10000000 itérations par division les perf du C++): Code :
- le comportement du C++ est linéaire par rapport au nb de points. (il a même tendence à s'améliorer lorsque le nb de points augmente) - à l'inverse, le comportement du prgm Java se dégrade et tend apparemment vers un rapport 19 Mon interprétation est basée sur le fait que l'augmentation du nb de points a tendance à faire diminuer l'influence relative de la boucle principale sur l'ensemble du temps. Or cette boucle manipule essenciellement un int donc une donnée native. Ce genre de manipulation est le plus rapide car il n'y a pas de modèle objet à gérer (juste le coût d'interprétation du byte-code). Lorsque le programme manipule des objets les performances se dégradent, ce qui me semble logique, mais est facheux pour un langage à objets. Ceci n'est toutefois qu'une idée, et demanderai à être étudié plus finement. En C++, le surcoût de l'objet est presque nul, ce qui explique un comportement plus linéaire. Voila, j'ai essayé d'être complet, j'attends vos remarques, qui ne devraient pas tarder à pleuvoir. Merci de m'avoir lu. |
|||||||
|
|
20
|
|
|
#86 | ||
|
Membre émérite
![]() ![]() Inscription : mars 2002 Messages : 30 ![]() |
Citation:
Voila tout ce que tu dois savoir pour ecrire un compilateur ou une machine virtuel : http://java.sun.com/docs/books/vmspec/2nd-edition/html/VMSpecTOC.doc.html Si tu veux des infos sur l'api, il faut matter le javadoc. Citation:
http://java.sun.com/j2se/1.4/docs/api/java/lang/RuntimeException.html Tu voudrais quand meme pas qu'on soit obliger de tagger toutes les classes comme pouvant produire un NullPointerException ? Tu n'est pas programmeur C++ pour rien... Je ne vois pas trop l'interet d'hérité de la classe Vector. L'utilisation de Vector est a réservé exclusivement pour de l'acces Multi-Thread, ce n'est pas le cas, donc on utilise ArrayList. Et pour une structure de donnée de taille fixe, preferrera utiliser un tableau... La difference de 2 points dans l'espace donne ... un point dans l'espace... Bof ! Perso je recoderais la fonction pvect pour prendre 4 points et faire le calcul, on economise la construction 2 object intermediaire et on a un object qui ressemble a quelque chose. A la place de la salle fonction dup, je ferais plutot un constructeur de recopie, c'est quand meme plus élégant. Tu voulais des exemples d'application Java, voila ceux qui tourne tout le temps sur mon PC : -> Eclipse, Ide Java open source ( projet initié par IBM ) -> Jext, un editeur de texte open source -> Une interface graphique pour un client p2p. -> Un jeu d'echec ... D'autre gros projet : ->JBuilder, IDE java de Borland -> NetBeans, IDE java open source (de Sun) Je sais, il y a beaucoup d'IDE, mais Java est surtout utilisé pour le developpement des logiciel interne au entreprise, pas trop pour les application a destination des client. Autre example concret : L'application de gestion de la securité sociale Brésilienne, c'est du 100% Java, toute la chaine en partant de la carte a puce (equivalent de la carte vital) jusqu'au serveur d'application, en passant par les logiciel de traitement des medessin... 12 Millions de personnes. On estime aussi a 35 Millions le nombre de telephone portable basé sur J2ME. (source Login |
||
|
|
01
|
|
|
#87 | ||||||||||
|
Invité régulier
![]() Inscription : janvier 2003 Messages : 14 ![]() |
ORACLE (qui n'est tout de même pas un petit novice), écrit également ses interfaces en java (en tout cas celles que j'ai pu voir, ptet pas celles d'y a quelques années)... Mais je crois que ca ne vaut pas la peine d'en rajouter car de toute manière la discussion a déjà été fermée avant qu'elle puisse commencer avec la phrase ([quote]Alors je poserai la question : en quoi est écrit le moteur qui anime tout ça ?
) Je voudrais égalment rajouter à propos du code, que j'essaie de décortiquer (du code c++ écrit en java) pour l'instant, comporte également quelques méthodes totalement inutilisées (il y a même des méthodes qui étaient déjà en remarque...) ce qui réduit déjà grandement la différence de nombre de lignes de code... (soit une 50ene de lignes pour l'instant soit plus de la moitié de la différence, je n'ai pas compté les remarques personelles, qui concernant java, et non le code la dedans...). En réponse à la longueur du code + quelques critiques en passant... Pour les méthodes : ------------------------------------------------------------------- Code :
Code :
------------------------------------------------------------------- Code :
------------------------------ Code :
--------------------- Code :
...Dans la methode main .. j'ai pas compris à quoi ca servait Les remarques personelles ne concernant pas le code : // Il y a ici un mystere : d'apres la doc du JDK, elementAt() // est cense lancer ArrayIndexOutOfBoundsException. // comme at() ne traite pas l'exception et qu'elle // ne la transmet pas non plus, elle ne devrait pas compiler .. // Or, elle compile tres bien avec le compilo de Sun // J'ai du rater une marche quelque part // Concernant le code lui-même, déjà une amélioration à faire... Dans une de tes boucles dans la classe Polygone tu crée sans cesse Enumeration (méthode aire)... En remplacant ca par un tableau que tu crées une fois pour toute dans ta méthode readPolygone, ca reduit déjà le temps d'exécution. Donc autrement dit pas besoin d'hériter de Vector, qui pour moi n'est pas une tres bonne idée dans ce cas... suite peut etre dans un prochain épisode |
||||||||||
|
|
00
|
|
|
#88 |
|
Invité régulier
![]() Inscription : janvier 2003 Messages : 14 ![]() |
Pour le programme java :
sur ma machine (XP2200,512meg)ca prend 9 secondes Après avoir bidouillé un peu dans le code java, j'ai pu constaté que la lenteur de ton programme ne provient même pas des calculs. Bizarre non? Effectivement, j'ai éliminé tous les calculs du programme et c'était toujours aussi lent... En cherchant un peu j'ai remarqué que dans ta classe point3, et cela à peu près dans toutes ses méthodes, tu recréais un objet point3. J'ai remanié un peu le code et en ne créant plus de Point3 à chaque méthode je tombe à 2 secondes (avec le retrait de l'Enumeration qui tu utilisait dans la classe Polygone). Comme quoi, la 'lenteur' de java vient peut-être de la façon de programmer, mais ça à mon avis c'est dans tous les langages. En l'occurance, ici il n'y avait vraiment pas besoin de créer un instance de Point à chaque méthode (pour moi c'est une erreur de conception de la classe Point3 ou une mauvaise connaissance et/ou d'utilisation de l'objet)... Il faudrait donc revoir tes statistiques de performances c++/java un peu à la baisse... Je mettrai le code remanié des que j'aurai fini... |
|
|
00
|
|
|
#89 |
![]() ![]() Inscription : janvier 2003 Messages : 285 ![]() |
enfin un benchmark!
même remarques que Clément et gregy: -La classe Vector est prévue pour le multi-threading car les méthodes sont synchronisées. -A mon avis l'allocation dynamique d'un nouveau Point3 à chaque opération provoque une saturation du garbage-collector. En c++ les calculs sont fait sur la pile donc la mémoire n'est pas trop sollicité. En réécrivant les méthodes pour faire en sorte de ne travailler qu'avec une instance le gain peut dépasser 300% (c'est ce que j'ai remarqué dans mon appli et c'est ce qu'a remarqué gregy). un peu comme ce que j'ai proposé dans un autre message. De plus un appel à new impose une synchronisation avec le garbage-collector. Avec tout ca je trouve que java se débrouille plutot bien non ? Maintenant il faudrait refaire les tests. Il est a noté que la jre IBM 1.4 sous linux est bien plus rapide et plus optimisée pour le calcul que celle de sun. J'ajoute aussi que faire une boucle de 10^8 c'est pas tip top si les données sont toujours les mêmes car tu favorises le cache mémoire. En plus ce n'est pas vraiment représentatif d'une vraie appli de calcul scientifique.Java se débrouille bcp mieux lorsque la taille de la donnée à traiter augmente. Tu remarqueras que plus tu augmente la taille du polygone plus le ratio tend à se stabiliser.... J'ai effectué les benchmarks plus poussés en analyse numérique proposés sur le site de Scimark 2. On peut y récupérer le code en c et le code java et comparer ses résultats avec ceux dans la base. On peut lancer les tests avec une taille normale et avec une taille large des données. On remarque que java se débrouille mieux si la taille des données augmentent. C'est à dire lorsque les calculs sortent du cache mémoire. Java gère mieux la mémoire apparemment. Quant à dire si java est plus rapide que le c cela dépend bien sur de votre machine mais il y a plus de chance avec la jre IBM 1.4 sous Linux et un pentium 4 ou un amd athlon. Voili voila. perso j'obtient sur un pentium 4 1.7GHz win2K et jre sun 1.4: java normal : 129 MFlops c normal : 260 MFlops java large : 85 MFlops c large : 91 MFlops sur un amd 1800+ linux mandrake 9 et jre ibm 1.4: java normal : 251 MFlops c normal : 290 MFlops java large : 123 MFlops c large : 128 MFlops compilé en c avec gcc dans les deux cas avec l'option -03 |
|
|
00
|
|
|
#90 |
|
Invité(e)
![]() Messages : n/a ![]() |
->Les ordinateurs sont de plus en plus puissants donc la rapidité d'exécution est de moins en moins un problème.
Par pitié n'employez pas des banalités et idioties de ce genre !! Qui dit machine plus rapide dit machine faisant tourner des applis plus rapidement que sur d'autres machines . Donc gaspillage ENORME au niveau performances. Donc environnement de développement ( Java en l'occurence puisque c'est Java dont on parle) peu optimisé ou peu adéquat pour le développement informatique. Des machines plus puissantes ???? J'en viens à me poser la question de savoir à l'heure de .NET ou Java si je ne vais pas me remettre à l'assembleur ! Je fais une appli de cartographie sous Windows avec API 32 et même ce n'est pas assez performant ! Pour faire n'importe quel calcul en virgule flottante ou sur des matrices ou je ne sais quoi ,oui Java peut-être plus performant et rapide que le C++. Mais tous les tests de comparaisons exposés précedemment sont en ligne de commandes. Et pour afficher une fenêtre avec boutons et zones de textes tout le monde sait que ça rame en Java ! |
00
|
|
|
#91 | |||||||||||||||||||||||
|
Membre du Club
![]() Inscription : janvier 2003 Messages : 26 ![]() |
Citation:
Le compilateur n'a pas "négligé" de vérifier les paramètres, il les a convertis ! Pour vérifier que le compilo ne prend pas les float pour des double , remplaçons le passage par valeur par un passage par référence. Code :
par Test était correcte dans l'exemple que tu donnes, donc que le double a bien été converti en float. En résumé, pas d'erreur, ni à la compil, ni à l'exec. Bon, ceci étant dit, je développe. Sémantiquement, un passage de paramètres par valeur est très proche d'une affectation(1) : le parametre réel est affecté au paramètre formel. Si le paramètre réel peut etre "raisonnablement" converti vers le type du paramètre formel compte tenu de ce qu'il connait de ces types, le compilo le fait. Dans le contre-exemple que je donne pour monter que C++ vérifie bien les types, , ce n'est évidemment pas possible, car le passage par référence (physiquement: par adresse) conduirait la fonction f() à croire qu'elle reçoit un pointeur sur un float alors l'objet pointé est un double. Foirage garanti, d'ou cette fois-ci erreur de compil (et pas de warning, car ça ne PEUT PAS marcher, c'est donc bien un bug). La véritable question soulevée par ton intervention, ce n'est donc pas la vérification de type lors des appels de fonctions, c'est la décision de faire une conversion de type ou non. Tu vas bien sur objecter que ça ne change rien au fait que le passage du double à la place du float peut provoquer un débordement, donc une erreur. Cela peut effectivement se produire, de la même façon que ça peut se produire dans n'importe quelle expression même homogène du point de vue des types. Par exemple dans: Code :
(alors même qu'elle ne donnera pas le résultat attendu !) alors que la seconde est rejetée (alors qu'elle fonctionnerait parfaitement). Cette absurdité montre les limites du typage dans ce cadre, et c'est pour ça que C++ n'utilise pas le typage comme cela. J'ai ainsi démontré que le refus de conversion entre type compatibles dans une affectation n'est ni nécessaire, ni suffisant pour éviter les ennuis. Et il en va de même lors d'un passage d'argument par valeur, car celui-ci est une affectation. Par exemple si f reçoit un int : Code :
lors de la vérification de type. Non seulement ce genre d'utilisation du typage est inefficace, mais en plus elle est pernicieuse dans la mesure ou elle est de nature à donner une fausse impression de sécurité. Là ou ça devient comique, c'est que Java pratique la conversion pour les opérandes d'opérateurs arithmétiques, mais pas pour l'affectation. Or "=" est bien un opérateur (et non une instruction). Il y a là un comportement "non orthogonal", dicté evidemment par le désir d'améliorer la "sécurité". par exemple dans Code :
L'affectation est donc refusée, au nom d'une doctrine qui dit qu'on ne peut affecter un long à un int sous peine que tout vous saute à la figure. Arrivé à ce point de ma réflexion, et ayant constaté la différence de traitement profonde entre les deux opérateurs, j'ai essayé ceci : Code :
ne compile pas et celui qui compile va échouer lamentablement à l'exécution. (Les deux codes faisant la même chose, du moins d'un point de vue logique) Croustillant non ? Ceci montre que la conception du langage est incohérente. Les concepteurs ont fait le choix d'autoriser l'affectation dans ce contexte. OK ! , mais ils auraient fait l'autre, ça aurait été aussi mauvais : comment expliquer à un programmeur qu'on peut additionner un int et un long avec + et pas avec += ? Il est cocasse de constater qu'ils ont choisi la rustine la moins voyante, mais aussi la moins sûre. Bravo pour un langage qui proclame haut et fort qu'il pratique un "typage fort". Ceci montre s'il en était encore besoin que l'usage du typage fait par Java pour assurer les conversions est mauvais. Et je crois qu'il est mauvais car il est dogmatique. Les problèmes de conversion sont des problèmes sémantiques ardus. Qui peut réellement décider si un type X peut être converti en Y dans telle ou telle condition, sinon le programmeur ? Croire qu'appliquer des règles simplistes telles "on ne peut affecter un double à un float sous peine de compromettre la sécurité" permet de traiter ce genre de questions est une tromperie intellectuelle et une ânerie technique. Voila pour l'approche du problème des conversions entre types de base. Pour les types définis par l'utilisateur, c'est le néant : Pas de conversion possible (encore un manque d'orthogonalité par rapport aux types de base), sauf la conversion d'un type dérivé vers un type plus "basique", ce qui est une évidence en programmation objet. L'approche Java des véritables problèmes est toujours la même : circulez, rien à voir. Au lieu de cela, C++ part du principe que les conversions sont dangereuses, mais pas plus que n'importe quelle autre opération, comme je viens de le démontrer. On doit donc les intégrer dans l'ensemble du processus calculatoire du programme, comme un opérateur de plus. Et C++ offre des outils pour cela (conversion par opérateur, conversion par construction) qui permettent de préciser la sémantique de conversion (donc d'en augmenter la sécurité). Lorsque la conversion automatique est réellement problématique, il est possible de demander au programmeur de prendre ses responsabilités (mot clé explicit). Enfin, si le transtypage est impossible ou ambigu, C++ te jette, ce qui est une autre manière de te faire prendre tes responsabilités. Mais allons plus loin: Je pense que le design de Java à ce niveau va bloquer l'évolution du langage sur un point au moins. Supposons que sous la pression des utilisateurs, SUN veuille ajouter la définition d'opérateurs dans les classes. Pourquoi pas ? a+b sera alors interprêté comme quelque chose comme operator+(a,b), comme c'est le cas en C++ ou en ADA. Si a et b sont de types différents, mais potentiellement compatibles, que faire ? a) Refuser l'expression. Ce serait incoherent par rapport aux types prédéfinis sur lequels Java pratique des conversions. b) Convertir les paramètres réels de operator+() vers le type du paramètre formel correspondant. C'est ce que fait C++. Normalement, et pour être cohérent avec l'application actuelle du typage sur les paramètres de fonctions, c'est "impossible" en Java. c) Exiger un transtypage manuel. Ceci conduit à un code du style X x = (X)a + (X)b ; Bonjour le codage! ce n'est pas marrant à utiliser, et ca fait exactement ce que fait la solution précédente de façon automatique. (1) en fait, il s'agit plus précisément d'une construction. Citation:
si un warning vaut la peine d'être pris en compte, ça me semble parfait. Citation:
pour supprimer les warnings, ça ne change rien au langage ! Citation:
je me fais tacler ! Tu n'aurais pas un argument un peu moins lapidaire et un peu plus clair ? Citation:
pour des imbéciles en leur faisant prendre des vessies pour des lanternes. |
|||||||||||||||||||||||
|
|
10
|
|
|
#92 | ||||||||||||
|
Membre du Club
![]() Inscription : janvier 2003 Messages : 26 ![]() |
quote]
Citation:
Le document proposé est une spécification SUN, rien de plus. Une norme est élaborée de façon publique par un comité genre ISO, AFNOR, ANSI etc.. Si j'ai le temps, je vous raconterai pourquoi Sun n'a jamais voulu que Java soit normalisé. En attendant, je maintiens que l'implémentation de Sun reste la seule référence possible. Citation:
Dire que je m'étais imaginé que la signature des méthodes renseignait leur utilisateur potentiel sur ce à quoi il pouvait s'attendre. Je cite un livre qui dit beaucoup de bien de Java: "La signature d'une méthode comprends la déclaration des exceptions susceptibles de remonter lors de l'appel de cette méthode" Bon, je croyais tenir un domaine dans lequel Java était plus clean que C++, mais je vois que c'est encore raté. Citation:
offert par Vector pour manipuler les polygones. Si je n'avais pas voulu cela, Polygone aurait juste utilisé un Vector en interne et aurait du fournir des fonctions d'accès. Cela aurait encore ralenti cette classe, alors ne vous plaignez pas. A propose de ArrayList, vous auriez du essayer avant de proposer cette "optimisation" ArrayList n'a pas la même interface que Vector : j'ai du remplacer ce qui suit Code :
l'accès via la méthode at() (qui utilise get() et réalise le transtypage). Si vous voyez un autre moyen, je suis preneur. Le résultat des courses, c'est qu'il faut 27 secondes au lieu de 24 secondes pour réaliser le test le plus court. Je suis peut-être qu'un programmeur C++, mais je teste avant de dire une bêtise. En ce qui concerne la taille fixe, merci, je me doute bien qu'un tableau serait plus efficace. Mais la taille n'est pas fixe. Citation:
Code :
Citation:
vous voulez dire. Citation:
Cela conduit à ecrire au lieu de Je veux bien, mais ça ne me parait pas evident. |
||||||||||||
|
|
00
|
|
|
#93 | ||||||||||
![]() ![]() Inscription : janvier 2003 Messages : 285 ![]() |
Citation:
http://java.sun.com/pr/1999/12/pr991207-08.html Même s'il n'y a pas de normalisation, la spécification de la plateforme java2 permet de maintenir des implémentations cohérentes de la part des constructeurs. Weblogic, webSphere, jboss, sun one (encore heureux!), borland appserver, etc... sont des serveurs d'application respectant la spec j2EE . Cela dit, on parle couramment de norme j2EE, même si elle n'est pas validée pas un organisme. Tout le monde peut télécharger la spéc j2ee et commencer à faire son serveur d'application (bon courage quand même). c'est valable pour une machine virtuelle aussi. Un programme java compile et se comporte de la même manière avec la jre ibm ou sun.... Citation:
Avec ce code : Code :
Soit un gain de 35%. Maintenant avec les iterateurs, Vector reste constant et ArrayList descend à 51705. Soit une perte de 28% Comment expliquer ca? Y'a -til une optimisation faites par la jvm? Ca n'empeche pas que le vrai gain se situe coté mémoire...Faire attention à ne pas saturer inutilement le garbage-collector. Citation:
Citation:
Citation:
Citation:
Et puis : byte i=0; i = i+3L ne marche pas car le compilo voit que le calcul doit se faire en long sans perte de précision, mais l'affectation risque de provoquer une perte de précision. d'ou erreur. byte i=0;i+=128L; ca marche car on incrémente par une constante vue comme un octet avec la formule : (constante modulo 128) - 128. C'est circulaire si tu veux. Regle : les affectations de variables doivent être cohérentes en type. Les incrémentations, et autres opérations *=, /=, sont calculées au modulo prés. Comme ce que j'ai montré dans mon précédent exemple, pas de conversion implicite par affectation, donc plus strict que c++. C'est simplement une règle du compilo, ou est l'erreur la? Ca permet de calculer simplement des offsets dans un tableau en faisant des additions avec un modulo effectué gratuitement plutot que "le reste de la division entière de ....blablabla". Citation:
Le c++ permet de gérer plus finement les conversions (et offre la possibilité de faire n'importe quoi), d'ou une attention particulière de la part du programmeur. Généralement, les simplifications proposées sont difficilement maintenable; ce qui est maintenable, c'est un code simple et clair. Ce qui est parfois incompatible avec les performances. |
||||||||||
|
|
01
|
|
|
#94 | ||||||||
|
Invité régulier
![]() Inscription : janvier 2003 Messages : 14 ![]() |
bon pour le code ... avant toute chose, ce code n'a aucun but d'estétique informatique. Etant donné que ce ne sont ni mes classes et que dans la vie de tous le jours je ne programmes pas des appli de ""géométrie"" qui calculent des aires... En résumé j'ai bidouillé autour de l'existant juste pour montrer que la facon de coder peut grandement améliorer les soit disantes "mé-performances" de java... Mais d'autres façons de faire existent, il y a certainement moyen de faire beaucoup plus beau et certainement encore plus performant, voir certaines autres remarques, là n'était pas mon but ...
classe aire Code :
Code :
Code :
Code :
code ++gib : 4 points prennent 9 secondes à s'exécuter 8 points prennent 25 secondes à s'exécuter mon code : 4 points prennent 2 secondes à s'exécuter 8 points prennent 5 secondes à s'exécuter déolé je n'ai pas eu le courage de créer un fichier avec 64 points .... La principale adaptation a été d'enlever la création d'instances de point3 dans énormément de méthodes. je passes de 90000005 à 10000005 (= nombre d'iterations (le résutat de la somme) + les 4 points + 1?)instanciations soit un facteur de 9, que je suis sur qu'il y a moyen d'améliorer encore car ca me semble beaucoup pour 'l'exercice' en question. Si mes calculs sont bons il n'en faudrait que 5 (pour 4 points), ce qui est faisable assez facilement (Là je rejoint l'avis de clément, il faudrait une méthode permettant d'envoyer plusieurs points dans la méthode aire, sans devoir pour autant à chaque fois réinstancier l'objet Point3).... Alors java n'est pas performant avec les objets?? Evidemment quand programme à la façon sauvage, on obtient des résultats médiocres... |
||||||||
|
|
00
|
|
|
#95 | |||||||||||||
|
Membre du Club
![]() Inscription : janvier 2003 Messages : 26 ![]() |
Citation:
Le but est de mesurer les perfs. Si le code n'est pas utilisé, il ne doit pas avoir beaucoup d'influence sur les perfs. J'ai fait un copier/coller de mes fichiers, et j'aurais du retirer les méthodes inutilisées, mais ça ne change rien au résultat. Au passage, j'aurais préferé qu'on m'indique comment me passer de FormattedIStream. J'ai developpé ce truc pour faire ce que je fais en 1 ligne de C++, et je ne le trouve pas particulièrement beau. En effet, je me tape l'empilement de FileInputStream + InputSteamReader + FormattedIStream (qui utilise en interne StreamTokenizer) OUF !! Tout cela pour lire des double dans un fichier formatté ! Après cela, dire que Java est simple fait rigoler. Il est tellement "simple" que toute la complexité est reportée sur les bibliothèques. Je pense d'ailleurs que FormattedIStream est mal conçue : elle ne devrait utiliser les exceptions que pour les erreurs "hardware" et non pour les erreurs de formattage (mais ça, personne ne me l'a dit, occupés que vous êtes à "gratouiller" le code pour gagner les précieuses secondes). Voila en tout cas ce qui arrive lorsqu'un outil n'est pas assez puissant : on perd son temps sur les à-cotés au lieu de se concentrer sur le problème posé. Citation:
(ie: par index) au conteneur. Pas utilisée car 10% plus lente. J'ai du d'ailleurs la remettre en service pour utiliser un ArrayList. Citation:
On gagne combien de secondes là ? Citation:
Pour la version C++, il suffit de la regarder au lieu de calomnier : Code :
Citation:
|
|||||||||||||
|
|
00
|
|
|
#96 | ||
![]() ![]() Inscription : janvier 2003 Messages : 285 ![]() |
Une exception devrait se produire seulement si le nombre de token numérique avant chaque ';' n'est pas un multiple de trois.
pour eviter de terminer une boucle par une exception , un truc dans ce style : while( stream.hasMorePolygons() ) { } Citation:
Citation:
avantages/inconvénients : *InputStream classe de base pour les flux de données entrant. Classe dérivant de inputStream : -FileInputStream : lire un fichier. -StringBufferInputStream : lire une chaine de charactere comme un flux *Decorateurs (classes dérivant de InputStream et possédant une référence sur un InputStream, permettant d'utiliser le comportement de base) -ObjetInputStream : lire un objet en version sérialisée provenant de n'importe quel inputStream éventuellement luî même décoré. -BufferedInputStream : fait la même chose que le flux de base référencé, mais utilise un buffer -CheckedInputStream : utilisé pour zipper un flux .... Pareil pour outputStream... Swing utilise pas mal ce concept. |
||
|
|
00
|
|
|
#97 | ||||||||||||
|
Membre du Club
![]() Inscription : janvier 2003 Messages : 26 ![]() |
Citation:
Sur le fond: ------------ Je croyais avoir clairement énoncé les rêgles permettant une comparaison objectives des performances de deux langages (ce que personne n'a contesté). Or te voila parti dans une course à l'optimisation en bidouillant le code à mort (le terme "bidouiller" est de toi, mais il est approprié). Que crois tu avoir prouvé ? Que Java est un langage très rapide ? Quelle naiveté ! Il ne t'est pas venu à l'idée qu'il est possible de bidouiller des deux cotés ? (Quoique bidouiller autant me parait difficile) La rêgle de base est que les deux programmes fassent la même chose pour qu'on puisse les comparer. Si ce n'est pas le cas, on sodomise les insectes, rien de plus. Voici ce que tu as fait (je reconstitue ton cheminement intellectuel) Acte 1 ------ Les objets coûtant cher en Java, tu as décidé de mener les calculs sur des tableaux plutôt que sur des vecteurs. Tu as donc introduit un tableau de Point3 (structure de donnée de bas niveau) dans la classe polygone. Manque de pot, ceci revient à gérér la mémoire "à la main" puisqu'un tableau doit être dimensionné explicitement. Bref comme en C (pas C++). Donc tu as l'idée de garder le Vector, a coté du tableau et de recopier le Vecteur dans le tableau juste après la lecture du fichier (toPoint3Array()). Vlan, une méthode de plus et deux structures de données utilisées en parallèle. D'ou perte de place et problèmes de cohérence en perspective. En effet, ainsi "équipé" le Polygone ne peut plus être modifié (ajout/suppression de points) sous peine d'introduire une incohérence entre le tableau et le Vector. Quelle belle conception. Acte 2 ------ Les objets coutant cher en Java, tu as aussi l'idée d'en limiter la manipulation dans la méthode calcul Polygone.aire(), en ne créant pas d'objet intermédiaire pour stocker les résultats intermédiaires. Quelle bonne idée ! Pour y parvenir, tu décide de changer la sémantique de add qui passe de simple addition (+) à addition-rangement (+=), de façon à mener le calcul sur les Point3 du tableau eux-mêmes. Même opération sur le produit vectoriel. Stop ! Ici, ton programme ne fait plus la même chose qu'avant et en étant honnête, tu aurais du faire le même type de modif sur la version C++. Tu aurais alors constaté une accélération de celle-ci. Mais le pire reste à venir. Ayant fait cela, tu as constaté que le ton programme ne marchait plus. Acte 3 ------ Phase de "débuggage". Ton (nouvel) algo fonctionne une fois, et échoue les 9999999 autres. La raison en est simple : comme tu fais les calculs en utilisant les points du polygone commes variables intermédiaires, le polygone est détruit à l'issue du premier calcul. Au lieu de constater ton erreur et d'essayer une autre solution, tu persistes en bidouillant la classe "Point3", qui jusqu'ici avait echappé à ta fureur optimisatrice. Commes les Point3 sont écrasés tu imagines de dupliquer les données à l'intérieur de ceux ci : Code :
Pour recouvrir ta crotte, tu ajoutes également 2 méthodes ( 2 !! ) pour restaurer discrètement les données en cours de calcul. Code :
Code :
Bien sur, à l'issue du dernier calcul, on ressort de aire() avec un polygone vérolé. L'utilisateur à l'aire, mais plus son polygone, il doit être content. Il y a en C++ un mot clé const qui dit qu'une méthode s'engage à ne pas modifier son objet support. Voir mon code. OK, ce n'est pas assez bon pour Java mais ça t'aurait rendu service ici. Au moins une autre "optimisation" est nuisible dans ton programme : tu as sorti l'appel au duplicateur de point ( dup() ) de la méthode Polygone.addPoint3(). Cette duplication avait pour but d'éviter à l'utilisateur imprévoyant de se retrouver avec un polygone dont tous les éléments pointent sur un seul et même point. Problème typique de l'utilisation de pointeurs. Non allez je rigole ! Il n'y a pas de pointeur en Java. Comme cette tentative d'éviter les variables intermédiaires à foiré comme les précédentes, tu as remis l'appel à dup() (rebaptisé dub() ) dans l'appel de addPoint3() . Tu n'as donc rien gagné, mais en plus, le premier utilisateur naif de Polygone va se retrouver avec un bug lorqu'il utilisera addPoint3() en oubliant de dupliquer "a la main". Conclusion: =========== A propos des performances. ------------------------- Les performances que tu exhibes n'ont aucune valeur puisque le programme n'exécute plus les mêmes opérations. Je me suis abstenu de ce genre de manipulation (pourtant il m'aurait été très simple de fourguer un opérateur += à la place de + et autres raccourcis). Non seulement ton approche n'est pas honnête, mais en plus tes sabots sont particulièrement bruyants. Au passage, la taille des données à augmenté (plus de X 2) et le nombre de méthodes a aussi augmenté. A propos du style ----------------- La modélisation objet en a pris un sale coup. Un vecteur dans l'espace a trois composantes, et je ne vois par pourquoi je devrais déclarer six doubles. Même remarque pour la structure de données redondante et potentiellement incohérente de polygone. La programmation par objet permet théoriquement de rester proche du problème (en manipulant les concepts qui interviennent dans celui-ci) Or ton code est au ras de l'implémentation, basé sur des bidouilles qui feraient redoubler un étudiant de 1ère année de fac. A propos de Java ---------------- Je suis heureux que ce code m'offre l'occasion de montrer ce qui se passe lorsqu'un langage est insuffisant pour l'usage auquel on l'emploie. On passe des constructions de haut niveau à des constructions de bas niveau, par exemple ici on abandonne les Vector au profit des tableaux et les Point3 au profit d'une espèce de cache de 3 doubles qui évite d'avoir à créer un Point3 supplémentaire. Relisez les post antérieurs de Gregory Picavet et vous verrez qu'il préconise des techniques d'optimisation analogues: recopier les données dans des SD de bas niveau pour les manipuler. Le message émis par vos deux contributions est clair. Code :
de ce langage si on l'utilise pour autre chose que de programmer des interfaces. Si j'avais balancé ça tout de go, on m'aurait traité de Charlot. Mainenant que c'est arrivé en direct devant vous, peut-être y croirez-vous. Citation:
qu'un programme rédigé proprement. D'autre part pour t'apprendre ce qu'est une méthode scientifique, évalue la précision relative d'une mesure de 2 secondes avec une résolution de 1 seconde. Citation:
tu montres à l'évidence que Java n'est pas performant, SURTOUT avec les objets. Citation:
|
||||||||||||
|
|
20
|
|
|
#98 | ||||
![]() ![]() Inscription : janvier 2003 Messages : 285 ![]() |
Le parcours d'un Vector avec Enumeration est plus rapide que celui d'un Arraylist avec Iterator (cf message précédent)
En voila la preuve :v ArrayList dérive de AbstractList (comme LinkedList). Le code de l'itérateur est donc commun aux deux classes... code source de la classe interne AbstractList.Itr (itérateur): Code :
*next() vérifie les modifs concurrentes externe à l'iterateur et fait un appel polymorphique à get() code source de Vector : Code :
*aucune verif sur les modifs externe à l'enumération pour un même thread *synchronization seulement sur nextElement car on y modifie count. Par contre les méthodes get et set et d'accés en général sont plus rapides sur ArrayList (l'appel polymorphique est plus rapide qu'une synchro...) La méthode add est peut-être plus rapide sur Vector si on fait des ajouts répétés (genre 1000000...) Le cout amorti d'un ajout est O(1) pour les deux conteneurs, mais est atteint plus rapidement pour un Vector car il double la capacité à chaque réallocation, tandis qu'un ArrayList augmente de 50%. Mais on peut fixer le pourcentage dans le constructeur de Vector. Plus on le baisse, plus on se rapproche de O(n)... Si on voit le Vector comme une List, par contre, il devient plus lent qu'un ArrayList. (on utilise les mêmes méthodes que AbstractList) bref, l'intérêt d'un Vector est faible car il est possible de créer une version synchronisée pour tous les conteneurs. Le seul intérêt est Enumération par rapport à Iterator, mais pour plus de rapidité il vaut mieux utiliser get si on utilise ArrayList (un gain de 100%!!). Sinon, si on travaille sur une collection sans savoir ce que c'est réellement, la y'a pas le choix. |
||||
|
|
00
|
|
|
#99 | |||||||
|
Membre du Club
![]() Inscription : janvier 2003 Messages : 26 ![]() |
Citation:
Citation:
Code :
Citation:
J'ai aussi compris que l'héritage simple a tendance à génèrer un grand nombre de classes car on ne peut hériter de plusieurs fonctionnalités en 1 seul niveau. Pour en revenir a FormattedIStream : Pas d'autre moyen de lire des données dans un fichier texte de structure simple ? |
|||||||
|
|
00
|
|
|
#100 |
|
Membre émérite
![]() ![]() Inscription : mars 2002 Messages : 30 ![]() |
Merci ++gib, tu m'as ouvert les yeux, Java est un mauvais langage, une pâle copie du C++... Le tout puissant C++ a definitivement remporté la partie, d'ailleur je vais desuite corrigé mon pseudo :
++Clément Cunin Incrémenté de la sorte, je cours préché la bonne parole : - La programmation en environnement protégé n'apporte rien, La stabilité des application Java basé sur cet environnement protégé n'est que du vent. - Les milliers de programmeurs Java sont tous des cons qui n'y comprenne rien. - La technologie dotNet qui trouve ces fondement dans Java n'a pas plus d'interet... - Programmeur rangez vos servlets, rangez vos JSP, le retoure à la programmation des CGI est une nécessité, retrouvez toute la puissance des l'operateurs "<<" et ">>" pour géré vos flux. - Scientifique, industrielle reprogrammez vos applications en C++, c'est certe couteux, mais pensez à tous ces processeurs qui souffre d'être utilisé à presque 10% alors que le même programme C++ permeterait une utilisation de seulement 5% du processeur. ( C'est très important, un processeur qui travail moins, consomme moins, donc lute contre l'effet de serre...) Vive le Segmentation fault, vive le coreDump, vive le C++... Ce débat me fatigue, @+ |
|
|
02
|
Copyright © 2000-2013 - www.developpez.com