Bon pas un seul argument dans ce post, juste de l'ironie facile.Envoyé par Clement Cunin
Rien d'autre ?
Bon pas un seul argument dans ce post, juste de l'ironie facile.Envoyé par Clement Cunin
Rien d'autre ?
Bien sur que c'est de bas niveau !!Envoyé par Grégory Picavet
A part un programmeur système, personne ne se préoccupe de ça et heureusement !
Pourquoi ne pas gérer le cache du processeur ou le swap de la machine dans la
classe polygone ?
Tu vois la complexité du code propose par gregy ?
J'ai du me pincer lorsque j'ai vu sa restauration des donnnées écrasées !
Tu as vu qu'il était buggé ?
Tu as vu qu'il interdisait toute utilisation de la classe polygone autre que
pour le calcul de l'aire ?
Tu as vu qu'après son "traitement" il n'y avait plus ni extensibilité ni
réutilisabilité des classes ?
Tu as vu que son truc c'est tout, sauf objet ?
Tu rigoles ou quoi ?
Je rappelle que mes mesures n'ont toujours pas été contredites
par aucun d'entre vous, et que jusqu'a preuve du contraire, un programme Java
est environ 15 fois plus lent que le programme C++ equivalent.
Le progremme de gregy ne fait absolument pas la même chose que le programme d'origine
et il ne génère même pas le même résultat.
Si vous n'êtes pas convaincus, affichez le polygone avant de sortir du main()
Sert toi de ta tête et tu verras que tes objets pré-instanciés n'ont d'intérêt que parceque
on fait le MEME calcul 10000000 fois, UNIQUEMENT pour travailler sur des durées
mesurables.
Dans la vie réelle, on se contente de faire le calcul UNE fois lorsque'on est normal.
Par conséquent, ce cache ne sert à RIEN et n'améliorerait en rien les performances
de aire() dans un programme REEL.
C'est donc un artifice permettant d'exhiber des performances totalement fausses
en évitant des instanciations.
Vous me faites une sacré bande de naifs.
Je rappelle pour terminer que le sujet est
la comparaison de performances de programmes equivalents écrits en C++ et Java
Et non
Comment modifier un programme Java pour qu'il soit le moins lent possible.









Non, pour les arguments c'est dans mes posts precedants.Bon pas un seul argument dans ce post, juste de l'ironie facile.
Rien d'autre ?
Ton seul centre interet est de montré qu'un langage compilé en natif est plus rapide qu'un langage en environnement protégé sur un machine virtuel... Et si possible en prenant le point d'attacque le plus faible du langage et en lui imposant des truc inutil que tu sais rapide en C++...
TON programme java est 15 fois plus lent que TON programme C++
CQFD, ++gib n'a aucun interet dans se debat !
la différence entre circulaire et débordement.Très marrant, le coup du modulo 128. Sur un octet, ça s'appelle un débordement.
débordement c'est :
255L : 11111111 correspond à -1 pour un octet signé
+1L
0L : 00000000 correspond à 0 avec une retenu positionnée à 1
circulaire:
127L : (01111111)
+1L
128L : (10000000) correspond à -128 pour un octet signé
mais je te l'accorde ca n'a rien à voir avec java et c++
i = i+1 et i+=1 ne sont sémantiquement pas la même chose. puisque dans un cas c'est une affectation, dans l'autre une incrémentation. Ca n'a pas le même sens. Et pour allez plus loin, en java pour incrémenté, tu est obligé d'avoir affecté une valeur avant. Ce qui est + strict sémentiquement.
bon allez débordement, circulaire, on s'en fout c pareil je justifie simplement ce que le compilateur fait c tout. Une règle n'est pas une erreur. Si tu écris un compilo, tu dois écrire des règle sémantiques.
en c++, on peut faire tout ca, pas en java :
char s;
int i = (int)&s;
float *pf;
int *pi = (int *)pf;
class A{};
A a;
void * p = &a;
const int a;
int *pa = &a //warning seulement
pa = const_cast<int *> &a //pas de warning
Allez moi je peux dire n'importe quoi comme ++gib, de toute facon plus personne ne lit ce forum. hahaha,
je me cite avant de partir
Greg tu dis n'importe quoi là... et puis y'a même pas la preuve de terminaison pour prouver que ca marcheAlgo :
SI vous connaissez le C++ à 100%, la STL à 100%, que vous rêvez de performances toute la journée ET que votre appli n'est pas une appli de gestion, une appli distribuée d'entreprise, ALORS choisir C++ (si possible avec un compilo spécialisé intel C++ pour le SIMD)
SINON
SI vous programmez pour windows uniquement et que le java ca vous dit pas ALORS choisir DELPHI
SINON choisir JAVA
ce forum me gonfle!
tiens ca vient d'augmenter en quelque jour là (tu disais 10 à un moment). pipotage à outrance nuit gravement à la santé.environ 15 fois plus lent que le programme C++ equivalent
Dans le cas de ton exemple foireux, une seule instance suffit pour faire tous les calculs. Comme l'objet statiquement instancié sur la pile en c++......non?Sert toi de ta tête et tu verras que tes objets pré-instanciés n'ont d'intérêt que parceque
on fait le MEME calcul 10000000 fois,
L'algo des caches permet de s'approcher de O(1) en terme de gestion de ressources.
Et puis la gestion d'un cache ne relève pas du bas-niveau ou alors un serveur d'application est très bas niveau. C'est même un Design - pattern haut niveau !! gestion des pools BDD, préinstanciation des EJB pour le traitement des requetes client, passivation/activation par sérialisation, gestion des transactions.
Essaye de coder un cache en c++ qui fasse tout ca, et on en reparle.
Tu sais ++gib, tu n'étais pas obligé d'écrire un roman sur la bidouile, OUI c'est bien ce que j'ai dit, une bidouille!!!. Tu peux le décortiquer dans tous les sens, mais il y a une chose que tu comprends peut-être pas, c'est que le code de 'crotte' (pour ne pas te citer) était déjà là bien avant que je retouches une seule ligne. Enfin, je peux encore une fois remarquer ton objectivité suprême et visiblement tu n'as pas compris les premières phrases de mon post. Entre parenthèses je n'ai pas que ça à foutre non plus d'aller réécrire un code de polygone à la c**... Si j’ai dis que c’était une bidouille c’est pas pour rien…
Oui c'est une bidouille... Mais ne viens pas non plus avec un code qui est TRES TRES LOIN d'être optimisé... Si tu veux des idées y en a des tonnes... Une classe polygone... C'est très marrant, mais ta classe elle gère TRES mal les points. A part la méthode qui lit et qui fourre tout dans un Vector, retransformé 36000 fois en Enumeration etc ... je ne vois pas grand chose. Alors planche peut-être là dessus. Ta classe point? Elle réintancie sans cesse des objets points. Le fait de ne plus en faire c'est une bidouille( ?), c’est contourner le problème( ?), peut-être dans la façon dont je l'ai fait (et cela je l’ai dit depuis le début),mais sinon NON c'est optimiser un code! Alors ton objectivité à 2 sous tu peux la ranger! Enfin visiblement pour toi un langage objet c’est un langage où l’on instancie des objets de manière sauvage et non réfléchie, dans ce cas, effectivement Java n’est pas ton langage.
(1°)Evidemment quand on peut en utiliser 5/6 points3 (apres une ‘bidouille’ en plus j’utilise 6 objets Points3) au lieu 10^8 y a quoi se poser des questions(je sais pas lequel est le plus bidouille des 2, 6 ou 10^8 points?)… Et qui plus est, certainement dans exemple de traitement en boucle. Enfin quand on t’avance des arguments techniques tu n’y fait pas attention non plus, de toute façon c++ est mieux… (Messages de Grégory). Se prendre la tête ? Non ! Mais si ton objet de crotte est mal conçu dès le départ alors oui… Utiliser des tableaux ? C’est quoi le problème ?Pour écrire des programmes Java dont la vitesse soit acceptable vous devez:
1) Utiliser le moins d'objet possible ;
2) Utiliser les tableaux de préférence aux conteneurs évolués ;
3) Faire attention à ne pas saturer le GC (lu également dans une autre
contribution) ;
4) Vous prendre la tête pour imaginer les hacks les plus tordus.
Ce qui me fait un peu ‘rire’, c’est que tu critiques le code (je l’avais déjà fait au préalable)… Très bien,… Le polygone n’est plus la (en supposant que la classe/l’objet de base puisse un jour servir à quoi que ce soit d’intéressant…) ??? Peut tu me dire en quoi il n’existe plus ? Les points sont toujours là et réutilisables… Mais quand on réduit assez fortement ton fameux facteur de 12/15, alors la réponse c’est que de toute façon c++ est plus rapide, que 2 secondes c’en est peut-être 3, que quand on optimise un code c’est de la bidouille (certes, c’est que j’ai fait et y a moyen de faire beaucoup mieux…). Alors ton objectivité que tu as clamé haut et fort quelques post plus hauts, je ne peut en avoir que des doutes… Moi je te montres que tes test sont faux, je n’ai pas voulu faire un beau programme, au cas où c’était possible de faire quelque chose avec ce semblant de brol de polygone… ‘Moi au moins j’avance les preuves de ce que je dis ‘ ben, mon vieux, garde tes preuves pour toi…
Hacké ? Faudrait que tu prennes tu dico Anglais – Français, je crois que tu n’as pas du comprendre le sens du mot… Buggé ? Le programme tourne, il calcule 10^8/10^9/… fois l’aire de polygones à 4/8/… points. C’est pas ça le but ? Enfin si c’est pas ça le but faut m’expliquer alors (et OUI il y a moyen de réuitliser le polygone…, c’est pas pcq j’ai enlevé certaines méthodes ds Aire qu’il n’y a pas moyen de les réutiliser !!!). Pour ce qui est de la méthode scientifque, on ne fait que ‘concourir’ dans le même test. La méthode non ‘scientifique’, c’est toi qui la propose, alors ne craches peut-être pas dessus…D’autre part, ayant en partie une formation scientifique, propose moi des programmes qui permettent de faire ces calculs, car j’ai aucune envie de les programmer … En réumé,n’avance pas n’importe quoi…Bravo, ton programme hyper-hacké et buggé reste 3 fois plus lent
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.
Bravo ! Encore une fois relis ma première phrase du post ‘code’… Tu vas faire une comparaison d’un code bidouille avec un autre donc java est un mauvais langage…Ca c’est de la méthode scientifique!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.
Je voudrais également souligner la remarque sur le post de la longueur du code... Il faudrait peut-être apprendre à te relire!!!! C'est bien toi qui disais tout fier que le code c++ était plus court que celui de java. AH OUI, forcément quand on rajoute n'importe quoi dedans... Alors arrête de dire n'importe quoi... Ce n’était que ça le message !
Personne n'est naïf ici. Oui C++ est plus performant en exécution (il faudra quand que tu me montres où j’ai pu affirmer le contraire), et en exécution c'est TOUT. D'ailleurs y a que là dessus que tu argumentes. Oui C++ est plus performant pour la programmation système et de calculs. Mais le seul benchmark que tu propose c'est bizarre, c'est un programme de calcul (enfin ça y ressemble de loin...). Avec un code de crotte! Alors explique moi pourquoi tant de projets, qui sont bien plus ambitieux que de programmer un bête polygone qui sert à rien et autres que de la présentation ( !), sont fait en java. Visiblement les gens, d’après toi, sont tous devenus des imbéciles. Qu’on utilise java à tord et à travers ??? Moi je crois que ça avait été le cas, java serait à la poubelle depuis longtemps… Mais ce n’est pas la cas… Alors vient pas avec ton argument récurent qui est LA performance de C++ et 2-3 brols insignifiants… D’ailleurs s’il n’y avait que la rapidité d’exécution qui était importante, on programmerait tous en ASM… Petite question… Pourquoi tu ne programmes pas en ASM, tu peux avoir des performances bien plus grandes en ASM qu’en C++. Etant donné que c’est LE seul argument que tu sort entre C++/java, dis moi pourquoi tu ne programmes pas en ASM ???? (J’insiste !)
Au fait ? En tant que développeur( ?), dans quels types de projets tu travailles ?
Enfin en résumé, on peut t’avancer n’importe quel argument, tu vas le contrer avec (et surtout) des bétises. Je crois dès lors que ce débât ne vaut peut être plus la peine d’être continué ( ?) . Le mot de la fin étant de toute façon que C++ est mieux en TOUT point (bon allé peut être, et avec grande gentillesse de la part de ++gib, que java est quand même pas trop nulle pour les applis de ‘présentation’ (Merci ++gib, c’est trop gentil fallait pas, je suis sur que c++ ferait mieux))
Oulala c'est complexe... Par contre, je me suis peté une bosse dans la facon dont ++gib restaure ses données… A croire que tu n’as que le mot new à la boucheTu vois la complexité du code propose par gregy ?
J'ai du me pincer lorsque j'ai vu sa restauration des donnnées écrasées !
Où ca, je vais réparer le bug ..Tu as vu qu'il était buggé ?
Où ca, je vais réparer le bug .. Les points ne sont PAS ecrasés, alors dit moi où est le bug. Tu me dit dure comme fer que ca ne marche pas .. ben dit moi ou ??? tu veut que je restaure les donées en fin de parcour ??? ben si ce n’est que ca…Tu as vu qu'il interdisait toute utilisation de la classe polygone autre que
pour le calcul de l'aire ?
ah bon ? donnes des exemples…Tu as vu qu'après son "traitement" il n'y avait plus ni extensibilité ni
réutilisabilité des classes ?
oui effectivement j’instancie moins d’objets que toi, en est-ce pour autant moins objet ?Tu as vu que son truc c'est tout, sauf objet ?
C’est toi qui fait rigoler à la longue avec tes propos…Tu rigoles ou quoi ?
Quelles mesures ? Qu’il failait au moins instancier 900000000 objets pour calculer ton aire qui n’en vaut pas la peine ?Je rappelle que mes mesures n'ont toujours pas été contredites
Dit moi les sois – disants bugs car sinon revois tes statistiques de 1 à 3-4 fois (pour le benchmark en question) … Le pgm ne fait pas la mê chose??? relit TON énoncé... Pgm qui calcule des aires de plygones en boucles POINT FINAL... Y a pas plus d'éxigences que ca... qui plus est c'esy fait sur base de TES classes donc je n'ai rien iventé..par aucun d'entre vous, et que jusqu'a preuve du contraire, un programme Java
est environ 15 fois plus lent que le programme C++ equivalent.
Le progremme de gregy ne fait absolument pas la même chose que le programme d'origine
et il ne génère même pas le même résultat.
réinitilise les points avant de sortir de la boucle et t’auras tes valeurs… Je ne suis pas convaincu de ma solution, mes ton polygone est TOUJOURS la ... puisque de toute manière j'ai les valeurs initiales... Si c'est ca la BUG tu peut aller dormir... pfff j'arrete les discussion là alors...Si vous n'êtes pas convaincus, affichez le polygone avant de sortir du main()
Avec un pool de Points3 et des méthodes permettant de changer les coordonnés des points on peut calculer avec un minimum de points énormément de polygones… C’est un artifice ? Non… Par contre on pourrait peut-être croire que de faire for(int i = 0 ; i < 100000000 ; i++){ new Point() ; new Point() ; new Point() ; new Point() ; new Point() ; new Point () ; new Point() ; new Point() ; Point()} pour rien, serait un artifice pour discréditer javaSert toi de ta tête et tu verras que tes objets pré-instanciés n'ont d'intérêt que parceque
on fait le MEME calcul 10000000 fois, UNIQUEMENT pour travailler sur des durées
mesurables.
Dans la vie réelle, on se contente de faire le calcul UNE fois lorsque'on est normal.
Par conséquent, ce cache ne sert à RIEN et n'améliorerait en rien les performances
de aire() dans un programme REEL.
C'est donc un artifice permettant d'exhiber des performances totalement fausses
en évitant des instanciations.
ben non C++ est mieux…Vous me faites une sacré bande de naifs.
Oui quand c’est bien écrit dans les 2 langages alors..Je rappelle pour terminer que le sujet est
la comparaison de performances de programmes equivalents écrits en C++ et Java
On rend un programme moins lent donc c’est pas bon… Il faut que la programme soit syntaxiquement le même pour respecter à tes règles ??? Il faudrait que tu écrives les règles du jeux…. Mais à part ca le programme fait la même chose à part quelques trucs que j'ai oublié, mais bon j'ai du mal lire l'enoncé du problème...(HUM)Et non
Comment modifier un programme Java pour qu'il soit le moins lent possible.

Lorsqu'on est chef de projet on ne peut se plier qu'aux exigences du Directeur Informatique.
Mais là où intervient le problème c'est quand les solutions technologiques ne sont pas adaptées , sont mal choisies ou bien alors qu'il faille se laisser berner par des effets de mode ( .NET , Java...).
Car avant de s'engager sur un projet informatique , on a intérêt à s'y prendre à 2 fois et même plus dans le choix des outils de développements et solutions technologiques.C'est s'engager sur une durée...
Si les entreprises ne veulent pas investir dans des projets informatiques ( donc gel des projets , baisse conséquent du CA des SSII ) c'est qu'elles se sont rendues compte qu'un projet développé par des développeurs lambda n'aura jamais la touche finale de progiciels comme MS-Office , Word , Access , Star-Office ou autres du commerce.
Vous développez une appli pour un utilisateur : celui-ci va exprimer son mécontentement car il aimerait avoir dans les mains un outil aussi riche que Word ou Outlook avec des raccourcis partout , des assistants , une correction auto etc...
Et je ne suis pas sûr que les ateliers logiciels comme Java .NET ou Visual Basic permettent cela.
pour une mode, java est assez persistante. La plateforme est devenue très mature est cohérente. Ne la compare pas à .NET qui doit encore prouver ce qu'il annonce sur le papier. En fait il est aussi facile de se laisser berner par la désinformation (provenant de microsoft entre autres, ou même sun parfois). A partir du moment où on ne prend pas assez de recul sur une techonologie, on peut croire tout et n'importe quoi. Comme penser que .NET a inventé la roue ou les web services sont une révolution. Forcément si une entreprise laisse tomber son développement pour s'adapter à tout prix à la dernière technologie...Mais là où intervient le problème c'est quand les solutions technologiques ne sont pas adaptées , sont mal choisies ou bien alors qu'il faille se laisser berner par des effets de mode ( .NET , Java...).
Il est bcp plus risqué de se lancer dans .NET que java car le postulat est de faire confiance à Microsoft sur le long terme.
un peu de précisions:Et je ne suis pas sûr que les ateliers logiciels comme Java .NET ou Visual Basic permettent cela
-java n'est pas un atelier de génie logiciel. Rational Rose oui.
-Visual Studio est l'AGL de .NET et Visual Basic est un langage faisant partie de .NET
-tu proposes donc de faire des applications avec MFC et c++?









La question reste:
Je ne pense pas que le simple fait de pouvoir ajouter des raccourcis soit une justification a l'utilisation de C++ et MFC. D'autant plus que ces fonctionalites sont comme le reste, si l'utilisateur les veut, il faudra les lui faire payer.Vous développez une appli pour un utilisateur : celui-ci va exprimer son mécontentement car il aimerait avoir dans les mains un outil aussi riche que Word ou Outlook avec des raccourcis partout , des assistants , une correction auto etc...
Et je ne suis pas sûr que les langages comme Java .NET ou Visual Basic permettent cela.
En plus, j'ai parfois l'impression que pas mal de ces ajouts (a part peut-etre la correction auto) servent surtout pour les informaticiens qui aiment pas mal tout faire avec le clavier (d'ou les raccourcis) et pouvoir tout configurer (d'ou les assistants), ... Pas mal d'utilisateurs preferent la simplicite.
Neanmoins, simplement pour l'info, est-ce que Java sait faire cela?
<joke> la touche finale ce sont les bugs? </joke>qu'un projet développé par des développeurs lambda n'aura jamais la touche finale de progiciels comme MS-Office , Word , Access , Star-Office ou autres du commerce
Bien sur, pourquoi cela ne serait possible qu'avec MFC et c++? la correction auto dans Word n'a rien à voir avec la bibliothèque ou le langage. C'est de l'algorithmique. Et puis histoire d'enfoncer définitivement le clou : Star Office est programmé en java.Neanmoins, simplement pour l'info, est-ce que Java sait faire cela?
T'as oublié de fermer ta balise Joke...Star Office est programmé en java
Donc Star office en Java... C'est pour ca que sur le site de http://www.openoffice.org, il recommande d'avoir Microsoft Visual C++ comme compilo ?
The following should demonstrate in detail what steps have to be done to set up the environment:
Run the configure script according to the following example. We assume here that
STL, la lib Java bien connue...- the source code is in C:\oo643B
- your STLport files are stored in C:\STLport-4.0 (only in case you use your own STLport installation. If you don't have this, or just don't care, the version provided in the source code will be build)
En effet pour Java- JDK 1.3.1 is installed in C:\jdk1.3.1
VC++ le compilo Java donc...- the Microsoft Compiler is located in C:\PROGRA~1\MICROS~3\VC98 (or C:\program files\microsoft visual studio\vc98)
APIWin32 surement Java aussi...- the Microsoft SDK is located in C:\PROGRA~1\MICROS~5 (only applies for 643B and later)
Ca c'était l'install Windows. Allons sur l'install Linux voir ce qui s'y passe :
Je connais pas ca...- glibc 2.1.x or higher
Tiens encore un fameux compilo Java... Gcc en l'occurence.gcc: OpenOffice.org has been successfully build under Linux using the gcc versions 3.0.x, 3.1.1, and 3.2.1. Older versions were built with gcc 2.95.2. Version 2.96 does not work!
Je passe le reste des librairies ou on retrouve encore le SDK Java, biensur.
Voila c'était pour dire qu'un produit comme Staroffice entièrement écrit en Java, j'en rigole encore...
Ps : Pour ceux qui doutent -> http://www.openoffice.org/dev_docs/source/build.html
Je ne restaure rien, puisque je n'ai rien écrasé.Envoyé par gregy
C'est extêmement simple, voici ce qui se passe si on imprime le contenuOù ca, je vais réparer le bug ..Tu as vu qu'il était buggé ?
du polygone avant de sortir du programme :
Le première ligne, c'est le polygone originel
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Nb de points du polygone :4 0.0 0.0 0.0 0.0 10.0 0.0 0.0 10.0 10.0 0.0 0.0 10.0 ; Nb d'iterations :10000000 Aire : 100.0 Temps ecoule : (10000000 iterations) 10 secondes 0.0 0.0 0.0 100.0 -0.0 0.0 100.0 -0.0 0.0 0.0 0.0 10.0 ;
La dernière c'est ce qu'il en reste après le calcul d'aire.
Ce que fait la fonction aire() porte un nom en programmation :
c'est un effet de bord, et c'est reconnu comme étant une source de
bug redoutable lorsque c'est indésiré.
Maintenant, essaie de t'imaginer l'intérêt d'une fonction qui écrase
ses données d'entrée alors que ce n'est pas son rôle.
Par exemple que penserais-tu si println() écrabouillait ce que tu
imprimes ?
Ta vie ressemblerait à ceci :
Maintenant, tu peux réparer.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 X x = new X() ; X savx = new X(x) ; // je sauve x System.out.println(x) ; x = savx ; // je restaure
Ben si, ils sont écrasés. Voir ci-dessus.Où ca, je vais réparer le bug .. Les points ne sont PAS ecrasés, alors dit moi où est le bug. Tu me dit dure comme fer que ca ne marche pas .. ben dit moi ou ??? tu veut que je restaure les donées en fin de parcour ??? ben si ce n’est que ca…Tu as vu qu'il interdisait toute utilisation de la classe polygone autre que
pour le calcul de l'aire ?
Mais ce n'est pas (seulement) pour ça que la classe est inutilisable.
Essaie quelque chose d'aussi trivial que ceci.
J'ai juste ajouté 1 point. Ce n'est pas une grosse manip.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5Polygone pol = new Polygone() ; pol.readPolygone(fis) ; // fis est un FormattedIStream pol.addPoint(new Point(0.,2.,3.) ); System.out.println("Aire=" + pol.aire()) ;
addPoint() remet à jour le vecteur, mais pas le tableau de Point3.
Comme je l'avais prévu, il y a incohérence, le polygone a maintenant 5 points
mais aire() continue à calculer sur 4 !
Pas extensible car les données sont "private"ah bon ? donnes des exemples…Tu as vu qu'après son "traitement" il n'y avait plus ni extensibilité ni
réutilisabilité des classes ?
(et non "protected" ou "private protected")
Donc pas question d'étendre les fonctionnalités par héritage.
Comme en plus, l'interface est minimale, on est coincés.
Pas réutilisables car elle détruisent les données qu'on leur passe
qui voudrait réutiliser ça ?
Remplacer des objets (Polygone,Point3) par des types prédéfinisoui effectivement j’instancie moins d’objets que toi, en est-ce pour autant moins objet ?Tu as vu que son truc c'est tout, sauf objet ?
(tableau,double) , à l'évidence, ce n'est pas objet, c'est du BASIC.
Ben voila, c'est fait. Relis donc mes tableaux de chiffres.Dit moi les sois – disants bugs car sinon revois tes statistiques de 1 à 3-4 fois (pour le benchmark en question) … Le pgm ne fait pas la mê chose??? relit TON énoncé... Pgm qui calcule des aires de plygones en boucles POINT FINAL... Y a pas plus d'éxigences que ca... qui plus est c'esy fait sur base de TES classes donc je n'ai rien iventé..par aucun d'entre vous, et que jusqu'a preuve du contraire, un programme Java
est environ 15 fois plus lent que le programme C++ equivalent.
Le progremme de gregy ne fait absolument pas la même chose que le programme d'origine
et il ne génère même pas le même résultat.
Bon, donc il est bien cassé ce polygone ?réinitilise les points avant de sortir de la boucle et t’auras tes valeurs… Je ne suis pas convaincu de ma solution, mes ton polygone est TOUJOURS la ... puisque de toute manière j'ai les valeurs initiales... Si c'est ca la BUG tu peut aller dormir... pfff j'arrete les discussion là alors...Si vous n'êtes pas convaincus, affichez le polygone avant de sortir du main()
Bon, écoute, on se calme.Avec un pool de Points3 et des méthodes permettant de changer les coordonnés des points on peutSert toi de ta tête et tu verras que tes objets pré-instanciés n'ont d'intérêt que parceque
on fait le MEME calcul 10000000 fois, UNIQUEMENT pour travailler sur des durées
mesurables.
Dans la vie réelle, on se contente de faire le calcul UNE fois lorsque'on est normal.
Par conséquent, ce cache ne sert à RIEN et n'améliorerait en rien les performances
de aire() dans un programme REEL.
C'est donc un artifice permettant d'exhiber des performances totalement fausses
en évitant des instanciations.
calculer avec un minimum de points énormément de polygones… C’est un artifice ?
Non… Par contre on pourrait peut-être croire que de faire
for(int i = 0 ; i < 100000000 ; i++){ new Point() ; new Point() ; new Point() ; new Point() ; new Point() ; new Point () ; new Point() ; new Point() ; Point()} pour rien, serait un artifice pour discréditer java
Sincérement, je pense que tu devrais revoir ta position et attendre 2 jours
pour répondre. Crois moi, je sais très bien de quoi je parle lorsque je te dis
que ton code, ça ne va pas du tout.
Tu comprends bien que le but du jeu, ce n'est pas de calculer 10000000 fois un polygone,
c'est de faire un benchmark. Pour que ça marche, on doit appliquer les mêmes
algo des deux cotés, avec les moyens disponibles.
Ce n'est pas le cas avec ce que tu proposes.
J'espère qu'il est évident pour tout le monde que ça ne sert à rien de chercher
à gratouiller en se rapprochant de la machine parceque :
1) on va tous finir à l'assembleur et on aura rien prouvé;
2) pour se rapprocher de la machine, il y a tout ce qui faut en C++ et
tu vas te faire étriller. De toute façon je ne le ferai pas.
Nous comparons deux langages à objets. Java clame même haut et fort qu'il est
plus objet que C++. Il me semble donc naturel de programmer avec des objets.
Les deux programmes en créé la même quantité. C++ les manipule beaucoup plus
efficacement, c'est tout.
Ce n'est tout de même pas de ma faute si le seul moyen de créer un objet
en Java est new() !!
Je ne cherche pas à discréditer Java, j'utilise Java
pour faire ce pour quoi il est -théoriquement- prévu : de l'objet.
Si j'avais voulu être déloyal, je n'aurais fait QUE de l'objet.
J'ai choisi au contraire de mettre une bonne dose de calcul sur des types
de base, or c'est précisément là que ce langage est le moins lent,
comme tu as du le remarquer.
Je vais maintenant essayer de te faire comprendre pourquoi, même si elle
était bien implémentée, ta solution n'a pas de sens.
Fondamentalement, ton optimisation est basée sur le principe suivant :
recopier les coordonnées de chaque Point3 vers 3 double pour mener le calcul
en ayant à créer un minimum de Point3.
Bon, ce n'est pas très objet, ça ne correspond plus à l'algo d'origine,
mais jusque là ça a un sens.
On pourrait faire ça localement dans la boucle de aire(), ce qui revient
à shunter les méthodes de calcul vectoriel de Point3 et à faire du
pseudo-procédural.
Là ou ça ne va pas, c'est que tu as essayé de stocker les doubles
(en les dupliquant dans les points du polygone eux-mêmes) pour les
réutiliser lors de l'appel suivant de polygone(). Plus exactement, tu stockes
des valeurs initiales, les valeurs courantes étant écrasées par le calcul.
Le point crucial est "pour les réutiliser lors de l'appel suivant de polygone()".
Or la fonction polygone() n'est jamais réutilisée pour le même polygone
(qui aurait l'idée de faire N fois le même calcul ?)
Nous le faisons 10000000 fois uniquement pour pouvoir mesurer un temps.
Par conséquent, dans la vraie vie, ton optimisation ne sert à rien.
Elle est même néfaste : elle multiplie la taille des données par x 2
et elle fait perdre du temps, puisque tu initialises une sauvegarde
qui ne te servira jamais.
Pour te faire comprendre l'absurdité de ta démarche, je vais te donner
une solution basée sur le même principe que la tienne, mais appliquée
à Polygone plutot qu'a Point3
Cette solution laisse loin derrière n'importe quel programme C++
et ne demande que 3 lignes de plus que mon code d'origine.
1) Dans la classe Polygone ajouter:
2) Dans le constructeur ajouter
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 private double monAire ;
3) En tête de la méthode aire(), ajouter
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 monAire = -1.0;
4) remplacer le return de aire par
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 if(monAire != -1.0 ) return monAire ;
C'est tout !!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 return (monAire = 0.5 * som.norme()) ;
Essaie, je te prédis des performances à décoiffer les chauves,
et un résultat exact, sans casser le polygone.
En outre, plus on fera d'itérations sur aire(), meilleur sera le résultat.
J'intitule mon procédé "Résultat pré calculé"
(comme objet pré-instancié) et je dépose un brevet.
Ce code est totalement stupide, mais il répond à ce que tu crois être le problème:
obtenir les meilleurs chiffres possibles sur un benchmark, sans se soucier de ce à
quoi sert le benchmark. Pour y parvenir, il utilise comme le tiens une technique de
cache (mais appliquée à un plus haut niveau).
Ce n'est pas bon car il ne fait pas la même chose (rendant ainsi la comparaison impossible)On rend un programme moins lent donc c’est pas bon… Il faut que la programme soit syntaxiquement le même pour respecter à tes règles ??? Il faudrait que tu écrives les règles du jeux…. Mais à part ca le programme fait la même chose à part quelques trucs que j'ai oublié, mais bon j'ai du mal lire l'enoncé du problème...(HUM)
et AUSSI parceque la solution employée n'apporte rien en situation réelle (ie: hors benchmark)
Relis bien ce que j'ai écrit si tu n'est pas convaincu.
La syntaxe n'a rien à voir avec ça.
...</joke>
Je parlais de StarOffice développé par Sun et non d'openOffice basé sur le code source de staroffice... Mais autant pour moi qd même :
staroffice est effectivement programmé en c++ avec du java (plus de c++ que de java même). Bizarre pour un truc Sun mais bon, si tu te dis que java est trop lent, je te retorque que non car si tu veux une vraie appli en java : l'environnement de développement Eclipse. Bon la je suis sur, vu que l'utilise en ce moment![]()
Pour un peu se rafraîchir la mémoire:Bon, écoute, on se calme.
Sincérement, je pense que tu devrais revoir ta position et attendre 2 jours
pour répondre. Crois moi, je sais très bien de quoi je parle lorsque je te dis
que ton code, ça ne va pas du tout.
Tu comprends bien que le but du jeu, ce n'est pas de calculer 10000000 fois un polygone,
c'est de faire un benchmark. Pour que ça marche, on doit appliquer les mêmes
algo des deux cotés, avec les moyens disponibles.
Ce n'est pas le cas avec ce que tu proposes.
J'espère qu'il est évident pour tout le monde que ça ne sert à rien de chercher
à gratouiller en se rapprochant de la machine parceque :
1) on va tous finir à l'assembleur et on aura rien prouvé;
2) pour se rapprocher de la machine, il y a tout ce qui faut en C++ et
tu vas te faire étriller. De toute façon je ne le ferai pas.
Alors si t'es pas convaincu, fait un autre benchmark, c'est toi qui le propose... et pour info, un tableau en java est un objet... alors se rapprocher plus de la machine je vois vraiment pas où...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.
Qui te dis que pour autant tu devras reinstancier des objets??? J'ai adapté le pgm de TON benchmark... Je vais pas m'amuser à prévoir tous les cas, juste pour montrer que ton benchmark est faussé...Alors proposes autre chose et on verra...Le point crucial est "pour les réutiliser lors de l'appel suivant de polygone()".
Or la fonction polygone() n'est jamais réutilisée pour le même polygone
(qui aurait l'idée de faire N fois le même calcul ?)
Nous le faisons 10000000 fois uniquement pour pouvoir mesurer un temps.
Par conséquent, dans la vraie vie, ton optimisation ne sert à rien
tableau pas type . tableau = objet. tableau = referenceS à objets. Comprends?Remplacer des objets (Polygone,Point3) par des types prédéfinis
(tableau,double) , à l'évidence, ce n'est pas objet, c'est du BASIC.
Je ne vois pas où j'ai pu remplacer polygone??? Explique moi...
Je ne vois pas où j'ai pu remplacer point, j'en utilise moins mais à part ca ... les méthodes sont à mon au moins 80% les mêmes, sauf qu'elles ne se terminent pas avec un new, qui pour toi est visiblement ta seule solution de programmation. Alors si ce n'est pas de la mauvaise foi de dire que Polygone et Point sont transformés en 'type prédéfinis' je ne comprends plus... Pour le Basic, faut croire que les classes étaient déjà écrites en basic...
Primo : La copie des donnée est utilisée, sinon effectivement les calculs seraient faux. Elle provoque une perte de temps??? Excuses moi,mais là tu as tout faux, c'est bien ces copie de données qui m'ont permis de restaurer les points sans devoir les reinstancier. Ce qui a valu une perte de temps de -7 secondes dans mon test...Elle est même néfaste : elle multiplie la taille des données par x 2
et elle fait perdre du temps, puisque tu initialises une sauvegarde
qui ne te servira jamais.
Deuxio : Elle mulitplie * 2 le nombre de données? Ah bon? Depuis quand tu te soucie de la taille des données? Pourtant créer (n Itterations * 9 ) d'objets points ca ne te posait pas de problèmes... Il faudrait savoir...
Tu sais y a encore moyen de tourner ton test encore de facon plus ridule... on peut p.ex. prendre le cas d'un carré de 10 de long de chaque côté.. comme ca y a plus de probleme ....Pour te faire comprendre l'absurdité de ta démarche, je vais te donner
une solution basée sur le même principe que la tienne, mais appliquée
à Polygone plutot qu'a Point3
Cette solution laisse loin derrière n'importe quel programme C++
et ne demande que 3 lignes de plus que mon code d'origine.
1) Dans la classe Polygone ajouter:
Code:
private double monAire ;
2) Dans le constructeur ajouter
Code:
monAire = -1.0;
3) En tête de la méthode aire(), ajouter
Code:
if(monAire != -1.0 ) return monAire ;
4) remplacer le return de aire par
Code:
return (monAire = 0.5 * som.norme()) ;
C'est tout !!
Essaie, je te prédis des performances à décoiffer les chauves,
et un résultat exact, sans casser le polygone.
En outre, plus on fera d'itérations sur aire(), meilleur sera le résultat.
J'intitule mon procédé "Résultat pré calculé"
(comme objet pré-instancié) et je dépose un brevet.
Ce code est totalement stupide, mais il répond à ce que tu crois être le problème:
obtenir les meilleurs chiffres possibles sur un benchmark, sans se soucier de ce à
quoi sert le benchmark. Pour y parvenir, il utilise comme le tiens une technique de
cache (mais appliquée à un plus haut niveau .... etc etc etc
La performance en sera encore plus grande... La seule chose que t'oublie c'est que je fait les calculs, les points sont peut-être écrasés à la fin (Voir LE bug), mais possibilté de restaurer les valeurs ou utilise les valeurs initiales dans toString de point, sans doute encore une bidouille, mais ce serait déjà plus logique et ca resoud ton fameux probleme)... d'autres bugs?? sans aucun doute, comme déjà dit mainte fois, mon but était d'accelérer le calcul et que forcément je ne suis pas passé partout donc forcément y a des fonctionnalités qui ne marche plus (jusqu'à présent une réelle qui est addPoint, car j'insiste ton polygone n'est pas cassé car je l'utilise tout de meme 10^8 fois)... Je me suis basé sur le fond du benchmark qui quand même était le calcul de l'aire... Si mon amélioration, n'est pas 'utilisable' en réel, il faut croire que ce benchmark en général n'est pas du tout repésentatif... De toute mnaière il ne l'est certainement pas(...)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 public static double aire(){ return 100.0d; }
Pour revenir au problème de tes principes de benchmark et je suppose que tu fais allusion à
et que personne ne t'as fait de remarque... Très bien! Mais qui t'as dit qu'on programmait de la même manière en C++ et java??? Etant donné que ces langages sont techniquement fort différent (voir messages de Grégory), qu'est-ce te permet dire que de préserver "le modèle objet" n'est pas déloyal? Désolé mais en java tu ne fais pas des new sans cesse dans une boucle comme illustré dans ton exemple. En java si tu as besoin de ressources tu les prévois (pools, caches etc) que l'on ne voit nulle part dans ton code.Alors oui ton code départ en java est l'illustration du programmeur c++ qui essaie de faire quelque chose en java, mais dans la "réalité", comme tu le dis si bien, on écrit pas comme ca....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.
Pour les autres remarques, je te laisses à ton ironie à 2 balles et ta subjectivité légendaire...

Merci beaucoup pour cette précision VisualCBien2 ( je vais pouvoir critiquer Java encore plusDonc Star office en Java... C'est pour ca que sur le site de http://www.openoffice.org, il recommande d'avoir Microsoft Visual C++ comme compilo ?)!!
Java et les autres outils associés c'est très bien.....très bien...s'il faut un compilateur C++ pour pouvoir en tirer profit..!
A titre de comparaison , c'est comme si on achetait une voiture et qu'il faudrait une autre voiture pour piéces pour pouvoir rouler avec la première !
On est libre d'utiliser l'environnement de développement de son choix....-java n'est pas un atelier de génie logiciel. Rational Rose oui.
-Visual Studio est l'AGL de .NET et Visual Basic est un langage faisant partie de .NET
-tu proposes donc de faire des applications avec MFC et c++?
Personne n'a compris ce que je voulais dire ...je me suis peut-être mal exprimé.D'autant plus que ces fonctionalites sont comme le reste, si l'utilisateur les veut, il faudra les lui faire payer.
Qu'importe l'environnement de développement que vous utilisez mais l'impression générale des travaux informatiques sur mesure donc prestations fournies par une société de service informatiques n'équivaut pas la touche des logiciels du commerce.
D'où la question : quel intérêt et quelle pertinence de développer un outil logiciel sur mesure pour une société ??
Tu ferais mieux d'arrêter, tu es en train de dire à tout le monde que:Très bien! Mais qui t'as dit qu'on programmait de la même manière en C++ et java??? Etant donné que ces langages sont techniquement fort différent (voir messages de Grégory), qu'est-ce te permet dire que de préserver "le modèle objet" n'est pas déloyal? Désolé mais en java tu ne fais pas des new sans cesse dans une boucle comme illustré dans ton exemple. En java si tu as besoin de ressources tu les prévois (pools, caches etc) que l'on ne voit nulle part dans ton code.Alors oui ton code départ en java est l'illustration du programmeur c++ qui essaie de faire quelque chose en java, mais dans la "réalité", comme tu le dis si bien, on écrit pas comme ca....
Je suis assez d'accord avec ce point de vue,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 POUR OBTENIR DES PERFORMANCES CORRECTES EN JAVA -On ne doit surtout pas programmer en objet -On doit gérer un maximum de ressources (pools, caches etc) soi-même à la main.
mais ça semble assez contre-productif pour Java.
Et bien, je suis content pour lui.Envoyé par Grégory Picavet
En C++ on ne se pose pas ce genre de question, mais je
te rappelle que le sujet c'était la comparaison C++ Java.
Utilise le conteneur que tu veux, mais montre moi un code STP.
attention car ca être de la critique...Merci beaucoup pour cette précision VisualCBien2 ( je vais pouvoir critiquer Java encore plus )!!
Java et les autres outils associés c'est très bien.....très bien...s'il faut un compilateur C++ pour pouvoir en tirer profit..!Waaa..Tu viens de tuer tout le monde avec cette comparaison. Je vais m'empresser de récupérer gcc pour recompiler le projet J2EE de 12000 classes sur lequel je travaille...A titre de comparaison , c'est comme si on achetait une voiture et qu'il faudrait une autre voiture pour piéces pour pouvoir rouler avec la première !
rien ne t'empêche de réaliser un programme entièrement en java, ou en c++ et java grace JNI. En quoi cela dénature le langage java? Je rappelle que java peut est très utile pour le scripting.
un exemple d'application entièrement java, dont la complexité n'a rien à envier à StarOffice : Eclipse (www.eclipse.org).
oui c'est pas la même chose de dire que c'est pas possible en java, .NET ou delphi, nuance...On est libre d'utiliser l'environnement de développement de son choix....
et quel est l'intérêt et la pertinence d'une telle question dans ce débat c++/java car avec les produits windows on peut faire du sur-mesure également.quel intérêt et quelle pertinence de développer un outil logiciel sur mesure pour une société ??
Mais je vais te répondre qq même: une société va demander un outil de gestion adapté à son entreprise, spécifique à son métier. Lui procurant une valeur ajoutée supplémentaire par rapport à un logiciel du commerce. De plus la plupart des projets en java concerne la mise au point d'une appli web distribuée. Tu en connais bcp dans le commerce?
Bref une société qui demanderait un logiciel de traitement de texte facturé 100K€, qui n'arriverait pas à faire le quart de la moitié de Word avec le double de bug si possible, j'y crois pas trop...
[qote]
i = i+1 et i+=1 ne sont sémantiquement pas la même chose. puisque dans un cas c'est une affectation, dans l'autre une incrémentation. Ca n'a pas le même sens. Et pour allez plus loin, en java pour incrémenté, tu est obligé d'avoir affecté une valeur avant. Ce qui est + strict sémentiquement.
[/quote]
Tu compte convaincre qui avec ça ?
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part i=i+1L ;
ont exactement le même effet donc les mêmes dangers.
Code : Sélectionner tout - Visualiser dans une fenêtre à part i += 1L ;
Le second est simplement une optimisation du premier.
Alors pourquoi Java refuse le premier et accepte le second ? Parcequ'il à été conçu par des
débutants qui n'ont pas compris que leur manière de traiter les conversions introduisait
des distortions sémantiques dans le langage.
Et bien voici ce que je m'attendais à lire.en c++, on peut faire tout ca, pas en java :
char s;
int i = (int)&s;
float *pf;
int *pi = (int *)pf;
class A{};
A a;
void * p = &a;
const int a;
int *pa = &a //warning seulement
pa = const_cast<int *> &a //pas de warning
Tous les exemples qui tu cites utilise un cast ou un pointeur qualifié de "universel".
En c++ comme en Java, utiliser un cast indique au compilateur que le programmeur
prend le controle du typage.
Un langage peut éviter de t'assassiner par derrière, mais il ne peut
pas t'empêcher de te suicider !
Voici les façons équivalentes de te suicider en Java.
Et ne viens surtout pas me dire que tu obtiens une exception dans le dernier cas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 int i = (int)( 1./3.) ; // résultat == 0 X x = new X() ; Y y = new Y() ; // Y n'hérite pas de X x = (X) y ;
et que tu vas la traiter. Quel traitement vas tu entreprendre gros malin ?
Partager