|
Publicité ' | ||||||||||||||||||||||||
|
|
#61 |
|
Membre éclairé
![]() Inscription : mars 2002 Messages : 395 ![]() |
non, .Net n'est pas "qu'une API" ;o)
D'ailleurs, Les API c'est le plus long à apprendre, dans une plate-forme. Pas la syntaxe d'un langage. allez, vocabulaire : Java et .Net sont des plate-formes (ie un environnement) : Java c'est un langage, mais c'est aussi des API standardisées et des conventions d'écriture du code. C'est enfin une architecture avec la définition du rôle de chaque composant (jvm, compilateur, serveur d'appli, etc..) .Net c'est des API standardisées, avec une architecture avec la définition du rôle de chaque composant (clr, compilateur, serveur d'appli, etc..). .Net ne possède pas un langage mais une couche adaptable qui permet de créer la syntaxe (donc les langages) que l'on veut. Mais du coup quand on connait C# on connait VB.Net et inversement : il y a juste quelques mot-clés à ré-apprendre. C++ n'est pas une plate-forme mais juste un langage. Après ça chaque entreprise crée sa propre plate-forme C++. Thomas
__________________
Creapage.net/blog |
|
|
10
|
|
|
#62 |
|
Inactif
Inscription : juillet 2002 Messages : 21 ![]() |
j'ajouterais qu'on oublie trop souvent que le java permet de réduire de beaucoup comparativement au c++ le temps de développement, qui aujourd'hui avec tout la concurence qui se fait, est vraiment primordiale
java est de plus en plus utilisé et ce dans divers domaine, on n'a qu'a pensé au téléphone cellulaire, pda (palm et ppc)... et maintenant java3d... certe avec java on a pas les même performances qu'en c++... mais ce n'est pas vraiment critique avec les processeurs actuelle |
|
|
01
|
|
|
#63 |
|
Inscription : janvier 2003 Messages : 2 ![]() |
Evidemment comme celà a été souligné on ne peut pas comparer directement .NET et Java comme je le fais dans mon post.
J'aurai du être plus précis, dans mon esprit .NET signifie un des langages supporté par .NET. C'est le pbl. .NET n'est pas centré sur un langage particulier alors que dans les fait que l'on dise Java ou J2EE c'est pour implicitement la même chose dans les discours. Le reste c'est une histoire d'environnement d'exécution. Mais que ce soit Java, C# et même C ou quoi que ce soit, le langage ne fait pas tout, il a besoin de s'appuyer sur des librairies qui le complète. De toute façon je pense que le mythe du langage/environnement à tout faire vit ses dernières heures. C'est flagrant avec les langages managés qui ont le méritent de dire clairement leur domaine d'utilisation. C'est ce que je n'aime pas avec le discours autour du C/C++. Bien sûr, en théorie on peut tout faire avec ces langages, mais en pratique ce n'est pas vrai. L'efficacité est dans la majorité des cas plus importante que la vitesse pure ou la compacité du source. |
|
|
02
|
|
|
#64 | ||||
|
Membre du Club
![]() Inscription : janvier 2003 Messages : 26 ![]() |
Citation:
La phrase etait "Je pourrais par exemple critiquer Java en parlant de javascript, ce qui ne serait pas malin." Ce qui signifie que java et javascript n'ont effectiivement rien a voir: une vague rssemblance syntaxique, et quelque concepts communs. Alors arrêtez de dire que je n'ai rien compris et relisez vous. La notion d'objet suffit à elle seule pour radicalement changer la façon d'aborder la programmation, ce qui suffit a faire de C++ un langage très différent de C. Mais il est plus facile de tout mettre dans le même panier. Mais C++ est bien que cela, car il permet de programmer selon 3 paradigmes. - full procédural - full objet - générique. Ce dernier point est passionant mais il n'est jamais abordé ici car coté Java, c'est le trou complet de ce coté là. Citation:
Vous venez vous même de citer un exemple un cas ou il n'y a aucun rattrapage, juste la constatation d'un problème. CQFD Citation:
Votre argumentation s'auto-détruit (en vol) Le fait de supposer que le module est déconnectable indique que l'erreur est prévue. On tombe bien dans le domaine d'application que je préconise pour les exceptions. Merci l'aller dans mon sens. Or vous parlez également d'erreur imprévue : comment un évênement imprévu peut engendrer une réaction appropriée prévue ? C'est illogique. Ou il existait une réponse à une situation prévue, et l'erreur a été de ne pas la mettre en oeuvre, ou on n'avait pas de réponse car l'erreur était imprévue. Dans les deux cas, les exceptions ne peuvent pas nous sauver. Les exception sont un bon outil, pas un outil magique ! Citation:
et je refuse (avec beaucoup d'autres) que l'efficacité de ce que j'écris soit dégradée parceque c'est un problème pour d'autres. J'ajouterais une fois de plus pour cette catégorie de personnes qu'un programme faux est faux, dans tous les langages du monde. Le fait d'avoir une bonne protection mémoire n'empêche pas les mauvaises surprises, et ne dispense pas de corriger. Vous voulez parler des threads ? Je suis à l'écoute. |
||||
|
|
20
|
|
|
#65 | |
|
Membre émérite
![]() Inscription : mars 2002 Messages : 30 ![]() |
Citation:
Je pense que tu n'as jamais programmé une application qui devait imperativement fonctionner, quelque soit les condition. Je comprends pas pourquoi tu t'obstine a vouloir arreter la totalité d'une application lorsqu'une petite parti identifiable s'avert defectueuse. (Comme si une voiture refusait de demarrer apres avoir fait une tache sur la banquette arrière) Je trouve bien pretencieux de ta part de dire que ton application que tu viens de faire marchera dans 100% des cas... Moi je prefere concevoir mon application, la tester affin quel passe tous mes tests, et dire, au cas ou, meme si j'ai laissé passé une erreurs, j'ai pris un maximum de précaution pour que ca se passe le mieux possible. Si mon application, meme lègerement buggé continue a être utilisable le temps que je trouve/corrige l'erreur, c'est regretable, mais pas aussi catastrophique que d'avoir fournit au client un programme qu'il ne plus utilisé jusqu'a ce que j'intervienne . Pour finir, Tu me reproche d'avoir couper une de tes phrases... mais je te ferais remarquer que Java n'a STRICTEMENT RIEN a voir avec javascript omparer Java et Javascript n'a pas plus de sens que de le comparer avec Cobol, Lisp, oCaml, perl, rebol ou qui que se soit ! En revanche, C++ apporte une dimension supplémentaire au C, ces 2 langages sont très proche, on en tire les même avantage et inconvénient ! |
|
|
|
02
|
|
|
#66 | ||||||
|
Membre du Club
![]() Inscription : janvier 2003 Messages : 26 ![]() |
Citation:
Citation:
toute seule lorsque les conditions sont défavorables. Lorsqu'on a affaire à un bug (ie: quelque chose de réllement 'imprévu), le gestionnaire d'exceptions ne sait pas si c'est une tache sur la banquette ou un niveau d'huile à zéro (Dans un cas ce n'est pas la peine de s'arrêter, dans l'autre, on le doit.) Vous pensez qu'on peut systématiquement continuer en mode dégradé, sous le prétexte que le contrôle à été rendu à un gestionnaire d'exception, vous vous trompez. Le problème n'est plus d'avoir la possibilité de faire quelque chose, mais savoir QUOI faire. Dans le cas des bugs, si on le savait, les ordinateurs seraient intelligents et cette discussion n'aurait pas lieu d'être. Si on ne le sait pas quoi faire on sort du domaine ou les exceptions sont utiles et celles-ci offrent donc une impression de sécurité trompeuses. Je m'empresse de dire que le programmeur qui a cette impression en est pleinement responsable, il ne s'agit nullement ici d'un défaut du concept "exception". Citation:
, maintenant voici que je suis crédité de propos jamais tenus ! Citation:
par tous les moyens offerts par le langage. Je rappelle que les exceptions n'augmentent pas les possibilités de traitement, elle permettent seulement de réaliser ceux-ci plus confortablement. Citation:
Sauf que dans la tête des gens, javascript commence par "java" comme C++ commence par "C", la syntaxe est vaguement identique, ça parle vaguement de classe etc.. C++ apporte effectivement une dimension supplementaire à C, et une belle : on a les mêmes avantages (performances), mais très peu des inconvénients (approche de + haut niveau, meilleure sécurité (si-si !), exceptions, possibilité d'utiliser les pointeurs là ou ils sont réellement nécessaires, E/S sécurisées , généricité qui renforce le typage sans perte de performances et permet d'avoir une très belle bibliothèque de composants (STL), modélisation objet qui change totalement le mode de résolution des problèmes, et j'en passe) Il y a un véritable "saut quantique" entre C et C++ et les gens qui ont "calé" sur C ont tord de ne pas s'intéresser à C++, c'est une autre dimension. Pour être concret, il me semble que ça fait une éternité que je n'ai plus géré la mémoire "a la main" : les conteneurs standards le font très bien, avec toute la souplesse voulue et des perf optimales. Vous n'es pas à l'aise avec les pointeurs ? Utilisez des vector<> et vous serez averti si vos indices dépassent les bornes. Mais si ça ne vous intéresse pas, vous n'êtes pas obligé d'y avoir recours et vous pouvez même implémenter des politiques plus subtiles. Dire après cela que C++ à les même inconvénients que C, c'est de l'ignorance ou de la calomnie ou les deux. |
||||||
|
|
20
|
|
|
#67 |
|
Membre émérite
![]() Inscription : mars 2002 Messages : 30 ![]() |
Tu refuse de comprendre l'interet des exceptions dans un environnement protégé. On peut aller beaucoup plus loin que le simple "oups, ca plante".
Pour ton information, j'aime beaucoup faire des projets en C pour manipuler la mémoire, c'est vraiment simpas de pouvoir travaillé à l'octets pret. Dans le cadre de petit project, c'est rigolo ! En revanche qu'en je fais un gros projet, le fait de devoir toujours penser a libérer la mémoire est trop pesant. |
|
|
02
|
|
|
#68 |
![]() ![]() Inscription : janvier 2003 Messages : 288 ![]() |
Pour ceux qui ont eu le courage de suivre la discussion jusqu'ici, je vais essayer de présenter objectivement
chaque technologie possède des avantages et des inconvénients dépendant du contexte d'utilisation. Vous trouverez ci-dessous une liste que j'espere assez exhaustive et qui reprend les points abordé jusqu'ici. N'hésitez pas à compléter ou corriger les erreurs. GENERALITES -java ne dipose pas de patrons de classes (templates), c++ oui. On peut s'en passer, mais les templates sont utilent pour les performances et un accroissement du typage. (en c++ vector<int> est un tableau d'entier, tandis que java.util.ArrayList est un tableau d'objets) -c++ propose la surchage des opérateurs, java non -java est fortement typé, c++ non (en java, un entier n'est pas un réel, sauf si on explicite la conversion) -java gère l'allocation/désallocation de mémoire et ne permet pas d'accéder par défaut directement à la mémoire. Un new en c++ revoie l'adresse mémoire réelle, un new en java renvoie un identifiant de zone mémoire gérée par la jvm (d'ou la sécurité) -java peut accéder directement à la mémoire (les DirectBuffer du nouveau package java.nio), mais dans ce cas la sécurité du code n'est plus garantie. La sécurité est cependant toujours plus élevée car pas d' arithmétique des pointeurs -l'arithmétique des pointeurs en c++ pas en java (simplification très utile pour l'accès direct) -passage des paramètres uniquement par valeur d'identifiant mémoire en java (donc pas de copie sur la pile), par copie et par référence en c++. -java ne dipose que d'un mécanisme d'allocation dynamique alors que c++ propose aussi l'allocation sur la pile. -java propose un ramasse-miette (garbage collector) qui marque les blocs libres et non-libres. Si un objet java n'est plus référencé, sa place mémoire sera réutilisée (mais on ne sait pas quand exactement) -java intègre son méta-modèle accessible avec java.lang.reflect. (ex : pour créer des scripts qui ne nécessitent pas d'être recompilés à chaque fois) -java charge les classes en mémoires à l'intant t si elle sont utilisées. -java n'a pas besoin de fichier header, puisqu'il n'a pas de précompilateur (du coup pas de templates non plus...). -une classe publique par fichier en java -une classe compilée en bytecode est toujours facilement décompilable et lisible, pas en c++ EXCEPTIONS -c++ et java propose un mécanisme d'exception (permettant de traiter le comportement exceptionnel d'un bloc d'instructions ou bien de traverser la pile d'appel des méthodes pour laisser la responsabilité du traitement à un niveau supérieur) THREADS -en java : threads gérés par la jvm et non le système d'exploitation. Gestion des sections critique, des attentes et notification, des groupes. Programmation simple par rapport à unix ou windows. SECURITE -java permet de définir une politique de sécurité très fine dans une application de manière très simple (ex un objet n'a pas le droit d'accéder au système de fichier, de se connecter à un serveur...).Le bytecode d'une classe externe est toujours vérifié par la JVM -le modèle de sécurité de java n'a pas de faille connue (ce qui ne veut pas dire que l'implémentation de sun l'est...) MODELE OBJET -notion de composant logiciel en java (javabeans) -pas d'héritage multiple (qui pose effectivement problème dans certains cas) -notion d'interface en java, en c++ non -toutes les méthodes java sont virtuelles, pas en c++ -les librairies java ont été développées autour de design patterns objets. notamentparadigme MVC (Model-View-Controller) et Compite pour Swing, Decorateur pour la gestion des flux d'entrée/sortie, Factory, ... Le développeur java bénéficie donc d'un environnement objet plus complet que c++. Attention : rien n'empêche d'utiliser les design pattern en c++ (c'est même recommendé). LIBRAIRIES STANDARDS ici la standardisation permet de faciliter l'interopérabilité (communication entre processus sur des systèmes différents) et la portabilité -C++ dispose de la librairie standard qui propose un découplage entre conteneurs de données et algorithmes manipulant les données (recherche, tri) -java dispose de swing (composants d'interface utilisateur), jdbc (transparence d'accès à un SGBD), rmi (communication entre jvm distantes, indépendante de la localisation), jaas (sécurité), jni (communication avec des composants natifs), jta (gestion des transactions), etc... -j2EE : framework permettant de développer des applications n-tiers d'entreprise . On parle de composant logiciels coté serveur (d'application) ou Entreprise-Javabeans (EJB). J2EE permet de découpler la logique métier de la technique (binding d'objet, persistance, transaction, etc...) .NET permet de faire tout ca mais il n'est standard que sur la plate-forme Windows... CONCLUSION - java est donc un langage simple (ce qui ne veut pas dire simpliste) optimisé pour le développement rapide et spécialisé pour le développement d'applications web distribuées d'entreprise. L'avantage de java réside avant tout dans les librairies dont il dispose. - c++ est un langage performant générant un code natif optimisé, plutot destiné aux applications temps-réel (simulation, jeux vidéo) et à la programmation système NB : en java, on peut effectivement obtenir des performances très proche du code natif, mais souvent au détriment du code qui devient moins lisible et moins objet . Je travaille sur un projet personnel de moteur 3D temps réel en java et opengl. J'obtient environ 80-90% des performances du c++ optimisé sans avoir sacrifié mon modèle objet. Certe des optimisations triviales comme la gestion d'un cache plutot qu'une allocation dynamique aléatoire est plus que souhaitable en java (regardez les serveurs d'application java). Je travaille également sur une application web distribuée d'entreprise (mon gagne pain cette fois!). La rapidité de développement, la qualité et la maintenabilité sont des contraintes importantes. Le C++ ne permettrait pas d'obtenir la même qualité pour un temps de développement donné. Meme avec .NET, on programme en Visual Basic ou c# (ce dernier étant plus une politique commerciale qu'une aide au développeur). Développer en C++ plutot qu'en java, revient à choisir la ferrari pour rouler plus vite dans les bouchons. Le goulot d'étranglement est internet, pas java. Par contre C++ est toujours très attrayant si on aime les templates, la surchage d'opérateurs, la gestion de la mémoire. Dans le domaine particulier des jeux vidéos, je pense qu'il faut choisir entre développer un jeu avec des performances inégalées (C++) ou des performances moindres (80% en moyenne) avec des outils très pratique (la gestion des scripts XML avec java c'est l'extase). |
|
|
10
|
|
|
#69 |
|
Membre régulier
![]() Inscription : décembre 2002 Messages : 60 ![]() |
Grégory Picavet:
Juste quelques remarques concernant le resume: Preciser que l'allocation dynamique C++ n'est pas sure en elle-meme. Elle necessite beaucoup d'attention pour eviter des faille de securite. Ensuite, Java n'est pas utilise que pour des application Internet. Dans le cas d'une application interne, et pas forcement reseau, le goulet d'etranglement n'existe plus. Neanmoins, rares restent les applications qui demandent un niveau de performance tel que la difference entre une application Java et une application C++ soit un probleme pour l'utilisateur. Pour finir, une question. Quand tu dis que tu obtiens des perf de 80 a 90% de celles du C++ avec Java, cela est-il toujours en passant par la machine Virtuelle ou apres avoir compile en code natif. Et dans le cas ou c'est en utilisant la machine virtuelle, as-tu essaye de compiler en code natif pour avoir une autre estimation des performances?
__________________
Si la connaissance peut créer des problemes, ce n'est pas par l'ignorance que l'on peut les résoudre. -- Isaac Asimov |
|
|
00
|
|
|
#70 | ||
|
Membre émérite
![]() Inscription : mars 2002 Messages : 30 ![]() |
Je suis completement d'accords avec Grégory Picavet, je valide donc cette synthèse...
Citation:
Citation:
Et j'ajouterais : - Java propose un environnement d'execution protégé, C++ non. (Un certain nombre des points cités étant la caracteristique d'un environement protégé, c'est donc un peu redondant mais toujours utile de le précisé, c'est le but de Java ) |
||
|
|
00
|
|
|
#71 | ||
![]() ![]() Inscription : janvier 2003 Messages : 288 ![]() |
Citation:
Je pense que ce résultat dépend de la machine et de l'application. Les applications sont celles qu'ont peut trouver sur le site http://nehe.gamedev.net. J'ai remarqué que sur un Pentium 4 avec ATI RAGE 128 + 8Mo j'obtient 80%-90%. Sur un AMD 1800+ avec GeForce 4 + 64Mo, j'obtient une image calculée par rafraichissement de l'écran ( pareil que c++ http://web.hypersurf.com/~sully/OpenGL/DemoBox.html http://chman-area.tuxfamily.org/index-fr.html Citation:
|
||
|
|
00
|
|
|
#72 | ||||||||||||||||
|
Membre du Club
![]() Inscription : janvier 2003 Messages : 26 ![]() |
Citation:
et je vais prouver que "l'incomparablement plus complexe" ne relève même pas de l'exagération : c'est du délire. Voici un petit code qui comporte une fonction ordinaire g() et une classe X munie d'une méthode f(). Ces deux "routines" sont appelées dans main() et reçoivent exactement la même quantité d'information : l'objet support x pour f() , et également x, passé explicitement pour g() Code :
Code :
Code :
Voici le code d'appel de la méthode f() Code :
Code :
coûte exactement ici 4 instructions machine, comme un appel de fonction, alors arrêtons de délirer ou de répéter sans vérifier. Pour être complet, il existe un cas ou l'appel de méthode est plus coûteux : si cette méthode est virtuelle, le cout "grimpe" a 5 instructions (oops!), mais on a une fonctionnalité supplémentaire : le polymorphisme, qui a un intérêt énorme en technologie objet. Techniquement, Le surcout provient de la nécessité de réaliser une indirection via la table des méthodes virtuelles de l'objet support. On remarque au passage qu'une fonctionnalité qui n'est pas utilisée ne coûte rien en C++ (Ce qui n'est pas le cas en Java). Code :
manipulé de la même façon. La manipulation d'un modèle objet est certe complexe, mais n'a pas d'impact sur les performances en mode compilé car le compilateur fait tout ce qu'il est possible de faire une fois pour toutes, avant exécution. En ce qui concerne Java, je ne connait pas le détail des opérations faites par la JVM lors de la manipulation des objets mais il est facile de comprendre qu'une partie du boulot est faite à l'execution. Pour creuser la chose, il faudrait avoir le code source de la JVM et y passer beaucoup de temps, ou demander à quelqu'un qui s'est déjà interessé au problème. Je constate simplement que ce c'est lent. Citation:
lequel on traite correctement une erreur totalement inattendue. Citation:
Le problème c'est que encore une fois, nous sommes censés parler de Java et de ..... de .... de .... C++ ! (oui , gagné !). Cet amalgame C/C++ est présent dans au moins 50% des interventions de ce forum, c'est regrettable et ça temoingne de la quantité d'idées toutes faites qui circulent. La question de gestion mémoire est très différente en C++ de celle du C car on n'en fait pratiquement plus (sauf si on programme des classes de très bas niveau, ce que le programmeur moyen ne fait pas car il s'appuie massivement sur des bibliothèques, toolkits, frameworks etc.). En pratique, on utilise des conteneurs génériques très bien faits qui la gèrent très bien. Le mécanisme de construction/destruction fait le reste quelel que soit la complexité de la structure de donnée mise en oeuvre. Je le répète : le C, c'est l'assembleur du C++ . |
||||||||||||||||
|
|
20
|
|
|
#73 |
![]() ![]() Marc LussacResponsable marketing opérationnel Inscription : mars 2002 Messages : 27 304 ![]() |
Vous seriez bien aimable de recentrer le débat sur C++ versus Java pour ce sujet, parce que :
- C# Versus Java c'est ici : http://www.developpez.net/forums/viewtopic.php?p=262725#262725 - .NET versus Java c'est ici : http://www.developpez.net/forums/viewtopic.php?t=30401 Merci de votre compéhension.
__________________
-> Ne pas me contacter pour le forum et je ne répondrai à aucune question technique -> Comment nous contacter -> Pour partenariat ou publicité : Mon Email |
|
00
|
|
|
#74 | ||
|
Invité régulier
![]() Inscription : janvier 2003 Messages : 14 ![]() |
Pour ma part d'accord avec Gregory + les petites rajoutes qui ont suivies... J'insiste également que java n'est pas uniquement utilisé que pour des application Web, même si tout est prévu pour en faire et que ca en fait un de ces domaines de prédilection.
Citation:
Citation:
En synthétisant tes messages ++gib, java ne vaut pas la peine, sauf pour faire de 'petites' appli, tout ca pour une raison de performances (qui n'est pas tant justifiée, sauf sur l'arguement 'choc' des progs qui tournent sur des vieux pc's), et quelques petites raisons de philosophie qui te genent personnellement. Alors les remarques 'Quelle ignorance', 'calomnie' et on en passe, on peut te les renvoyer quand est à ce point là pas objectif. Au fait on attend toujours l'explication à propos des différentes applications c++/java que tu aurait testé pour tirer tes conclusions sur java. |
||
|
|
00
|
|
|
#75 | ||||||
|
Membre du Club
![]() Inscription : janvier 2003 Messages : 26 ![]() |
[quote]
Citation:
des excuses si il le désire. Sur le fond, je ne changerai rien. Je remarque d'ailleursi que vous ne faite aucun commentaire sur ma dernière démonstration. Je serais intéressé d'en avoir un. Je rappelle également que je suis le seul a avoir pris la peine de produire du code, afin de permettre à chacun de vérifier que je n'ai pas simplement colporté un FUD de plus. Code :
1) Intérêt de Java : Il est grand dans certains domaines, très surestimé dans d'autres. Effectivement, hors des cas ou ont doit faire migrer du code, on peut très souvent faire mieux avec C++. Mieux ne signifie pas plus facilement ! Je sais parfaitement (et je le comprend) que Java est ressenti comme étant facile, et qu'il attire pour cela. Une question que cela pose est la suivante : Doit on privilégier celui qui écrit le programme ou celui qui l'utilise, la facilté au résultat ? En "bonne" logique économique qui ne se préoccupe que du profit à court terme, la réponse est oui, si on regarde plus loin, c'est non. J'ose espérer que ce forum concerne un peu la technique. Depuis 10 que Java existe, pourquoi aucun des grands logiciels qui cohabitent sur nos machines ne sont écrits en Java (OS, Traitements de texte, BD, Tableurs, etc). Pourquoi tous les prog Java qui on à faire autre chose que de la présentation de données s'appuient-ils sur des couches écrites en compilé ? Je sais qu'on va me tomber dessus en me parlant des tel ou tel système de gestion développé pour ou par telle grosse boîte (la taille de la boîte indiquant que, manifestement, ce n'est pas du bidon). Alors je poserai la question : en quoi est écrit le moteur qui anime tout ça ? L'application de gestion typique, c'est une interface graphique (dont les couches basses sont en C) qui envoie des requêtes SQL à un SGBD, reçoit et filtre les réponses et les affiche. Bon soit, ça présente un intérêt dans ce cadre sous certaines contraintes. Mais ce n'est pas avec ça que l'on peut prétendre à un statut de langage généraliste. Je n'ai jamais rien dit d'autre. 2) En ce qui concerne les vieux PC lents: je ne les ai jamais considéré comme les "arguments choc" dont vous parlez, relisez moi. Les machine rapides sont ralenties par Java dans le mêmes proportions que les lentes. Si on utilsait Java réellement comme un langage généraliste (ce qui n'est pas le cas, les gens ne sont pas fous) on retournerait à l'époque des PC 133Mhz. 3) Mon objectivité : J'ai bien envie de me fâcher encore. Je suis ici le seul à produire une preuve de ce que j'avance, et on critique mon objectivité. Vous feriez mieux de répondre à mes arguments autrement, ce serait plus crédible. Citation:
C'est chose faite. J'aimerai que les personnes intéressées se manifestent. Je propose de poster ici un code source C++ et Java, que chacun pourra mettre en oeuvre. et vérifier. Je pourrai en outre bénéficier de l'expertise des programmeurs Java (ou autre) qui m'indiqueront d'éventuelles améliorations. Je souligne qu'il est important de tester du code connu, sans quoi toute conclusion est impossible. J'ai par exemple vu passer sur ce forum une phrase du style "oui, le programme XXX est aussi rapide que YYY, etc.." Désolé, mais comme on ne sait pas ce que font réellement ni XXX ni YYY c'est du vent. |
||||||
|
|
20
|
|
|
#76 | ||
![]() ![]() Inscription : janvier 2003 Messages : 288 ![]() |
-100% d'accord avec toi ++gib sur l'indirection supplémentaire de la table des méthodes virtuelles. En java toutes les méthodes sont virtuelles, donc pas d'optimisation à ce niveau.
Mais il faut savoir que java a été concu par souci de simplicité (entre autres). Bien sur cela peut poser des pbl, voire dérouter pas mal de gens : y'a des trucs que j'aurais aimé dans java : -les templates du c++ qui permettent de faire ce qui ressemble à du polymorphisme statique, pour parler objet -le passage par référence du c++ (c# le propose) -surcharge des opérateurs (c# le propose) -l'héritage multiple. La solution de java est assez restrictive mais je la trouve meilleure que c++ qui s'en fout complétement (à moins de faire de l'héritage virtuel, mais ca devient vite le bordel). Des mécanismes seraient possible pour améliorer java. Cela étant, si les concepteurs de java ne l'ont pas fait, c'est certainement pour des raisons d'incompatibilité avec leur cahier des charges. Conflit avec la sécurité, transgression du modèle objet, spécificité du langage, etc... Aahh! si seulement on avait ce petit bijou qu'est la STL du c++ en java... trucs un peu bizarre de java: -finalize() dans les objets pas bien défini et pas bien utilisé en plus... trucs que j'aime bien en java par rapport au c++ (sans tenir compte des librairies): -méta modèle (pour diriger son appli avec des scripts par ex) -Les threads. Bon ok c'est plus en fonction de l'OS pour le c++, mais il faut avouer que c vraiment bien joué. -Sur les exceptions, je préfère finally pour désallouer des ressources plutot que les destructeurs appelés automatiquement (et encore si les objets sont sur la pile) lors qu'on sort d'un catch. En tout cas son existence est nécessaire puisque pas d'allocation sur la pile en java. autre point : si tu veux comparer le code c++ et java concernant de la synthese d'image en 3D temps réel, je t'invite à regarder les liens fournis plus haut. En tout cas java ne sert pas à faire que des jeux de cartes et j'affirme qu'un jeu comme quake 3 en java est sérieusement réalisable. avec 80% de la rapidité en c++, certes, mais avec un modèle objet plus complet et un temps de développement réduit. De plus dans ce domaine, ca dépend aussi si on se sent plus à l'aise en C++, java ou Delphi J'en profite pour donner un ou deux trucs pour ceux qui veulent faire de l'optimisation en java : -avoir une bonne modélisation, ca évite les usines à gaz (voir les Design Patterns, faire un peu de conception UML ca aide). Bon c'est de loin le plus difficile! -La condition numéro un à remplir pour obtenir de bonnes performances dans un programme java temps réel est d'utiliser l'allocation dynamique avec parcimonie et de coder un allocateur sous forme de pool (comme les ejb). J'obtiens une optimisation de 50% à 300% selon les cas. en effet ca evite de fragmenter la mémoire du garbage collector si on a bcp d'allocation/desallocation. En plus un new doit certainement se synchroniser avec le GC pour obtenir de la mémoire, d'ou perte temps... -Meme ordre d'optimisation : éviter le création d'objet temporaires. Le c++ dispose de la pile et du passage par référence constante, ce n'est pas une raison pour coder de la même facon en java. Bref il vaut mieux créer un objet de travail sur le tas, faire les opérations dessus, l'utiliser puis le libérer. Code :
Tiens au fait ce serait super des sujets sur "optimisation en java", "java et les jeux vidéos", "performance et modèle objet" dans ce forum. Je suis sur qu'il y a bcp à dire. |
||
|
|
00
|
|
|
#77 | |||||||||||||||||
|
Membre du Club
![]() Inscription : janvier 2003 Messages : 26 ![]() |
Citation:
Je suis plutôt d'accord avec l'ensemble de ce qui y est dit, mais voudrais corriger quelque points. Citation:
Qu'est ce que c'est que cette histoire ? Test Java Code :
Code :
Test C++ (avec gcc linux) Code :
Code :
(comme vous l'avez dit) les conteneurs génériques de C++ permettent de conserver un typage normal alors que Java relâche le typage lorsqu'on utilise des conteneurs permettant de stocker en vrac n'importe quel type d'objet. Citation:
avec la philosophie de Java. Citation:
Citation:
Citation:
le fonctionnement de Qt (http://www.trolltech.com) Celui ci offre (gratuitement) un précompilateur qui extrait un méta modèle du code source. Tout Qt est basé dessus et ça marche parfaitement bien. Si vous utilisez KDE, vous mettez en oeuvre ce méta modèle a chaque seconde, sans le savoir puisqu'il est à la base du système signal-slot. Citation:
(ni par un pré-compilateur). Ils sont gérés par le compilateur. Citation:
(source: JDK). Je pense que les green-threads doivent avoir des inconvénients dans certains cas. Il existe de nombreuses bibli de threads en C++. Je recommande Jthreads++, (http://www.iona.com/devcenter/orbacus/jtc.htm) qui fournit une implémentation des threads Java-like très élégante, tout aussi facile à utiliser que celle de Java. Ceci montre que la véritable puissance d'un langage est avant tout d'être extensible. Citation:
Comme je ne vous prends pas pour un menteur et que je suis plutôt sûr de mes mesures (qui ne collent absolument pas avec les votres), j'aimerai savoir ce que fait votre application, et ce que vous avez mesuré. Mon inquiétude vient de l'utilisation d'open GL. Il est notoire que les calculs 3D coûtent cher et doivent donc représenter une part importantes des temps d'exécution. Je me demande donc si vous n'avez pas mesuré les performance d'open GL (qui ne doit pas être écrit en Java, et peut d'ailleurs largement reposer sur le matériel) au lieu de celle de votre code. Avez vous profilé l'appli pour voir ou se passe le temps d'exécution ? Bref, l'histoire de la mouche dans un couloir de TGV et dont le GPS indique qu'elle vole à 280 Km/h. Qu'en pensez vous ? |
|||||||||||||||||
|
|
10
|
|
|
#78 | |||||
|
Invité régulier
![]() Inscription : janvier 2003 Messages : 14 ![]() |
Citation:
Pourquoi ne pas faire un benchamark sur ce qui est comparable? Sur des choses qui existent? Citation:
Citation:
Citation:
Pour ce qui est de la logique économique... Ben c'est à toi de voir... Le cours/moyen terme pourra faire en sorte que soit sur le marché (et avoir les parts de marché) en premier avec une appli de tres grande qualité dans une certaine technologie, avant d'autres mais qui au bout du compte auraient la même appli, mais soit disant '''BEAUCOUP''' plus performante, quelques années plus tard. (Non, je ne parles pas d'un OS ...) Citation:
Je vais pas me répeter c'est déjà dans la 1é remarque |
|||||
|
|
01
|
|
|
#79 | |
|
Membre régulier
![]() Inscription : décembre 2002 Messages : 60 ![]() |
Citation:
Il est tres clair que le code asm n'avait absolument pas pour but de demontrer quoique ce soit par rapport a Java, mais de montrer que la difference entre C et C++ compile n'est quasiment pas different, ce qui donne des performances de base comparables (ca peut ensuite pas mal changer en fonction des fonctions supplementaires qu'on peut mettre en oeuvre en C++ comme les exceptions, ...). Cette partie la ne me semble pas etre completement du vent. Maintenant, je suis d'accord, on a toujours rien vu concernant un benchmark valable de comparaison entre C++ et Java! Peut-etre ++gib devrait commencer a montrer quelque chose qui pourra ensuite etre adapte ou ameliore par d'autres.
__________________
Si la connaissance peut créer des problemes, ce n'est pas par l'ignorance que l'on peut les résoudre. -- Isaac Asimov |
|
|
|
10
|
|
|
#80 | |||||
![]() ![]() Inscription : janvier 2003 Messages : 288 ![]() |
comme tu viens de le démontrer, java est plus fortement typé que le c++ dans le sens ou il produit une erreur et pas un warning.
La relation "est un" est à prendre au sens objet, c'est à dire "peut se substituer à". En java, il faut effectuer un dynamic cast : int i = (int) 0.5f par ex, car c'est vu comme un transtypage (au sens objet), donc le typage java est plus strict. ------ arithmétique des pointeurs ca veut bien dire : si p1, p2 sont des pointeurs alors p1+p2 aussi, p1-p2, p1+1, etc... et donc permettent d'accéder à la mémoire un peu n'importe comment. En java, évidemment, ca n'a aucun sens. l'accès à la mémoire se fait par conteneur (avec get/set). D'ou un accroissement de la sécurité. De plus on peut convertir un tableau de type primitif en son équivalent DirectBuffer (et inversement) dans l'ordre natif des octets de la machine, de manière transparente. Citation:
Quant à la sécurité, je ne sais pas si elle est toujours garantie par rapport aux tiers, chose importante quand on travaille dans une architecture distribuée. ------ Citation:
En fait le code d'un template n'est compilé que si on réalise une instance de ce template. C'est un peu le point faible car tant qu'aucune instanciation n'est faite, il n'y a aucun moyen de vérifier le type (à chaque techno son inconvénient bien sur). pour ceux qui s'intéressent aux templates en java, il existe des projets en cours. http://igm.univ-mlv.fr/~forax/java/jlx/template/paper/Je crois que Sun, si ce n'est pas déjà fait, devrait s'inspirer de ces travaux de recherche qui sont très prometteurs. Citation:
Citation:
Citation:
Quant au profilage, ma foi, il est évident que le goulot d'étranglement est ici la capacité de la carte graphique. TOUS les calculs sont effectués par opengl, donc en natif. Si je veux distribuer mon appli, il faut que je fournisse une dll pour windows, une librairie pour linux, pour beos, etc.. qui sont fournies |
|||||
|
|
00
|
Copyright © 2000-2013 - www.developpez.com