|
Publicité ' | ||||||||||||||||||||||||
|
|
#81 | |
|
Membre émérite
![]() ![]() Inscription : décembre 2004 Messages : 585 ![]() |
Citation:
Par ailleurs, suivant les cas, il ne faut pas oublier qu'un GC avantage par rapport à une gestion manuelle de la mémoire : il peut faire le ménage par bloc, ce qui est bien moins couteux que de le faire par objet. Plus d'info par là http://www-128.ibm.com/developerwork...vaUrbanLegends ou là http://www.theserverside.com/news/th...hread_id=37146 . Il ne faut pas oublier les optimisations à l'exécution que la JVM peut faire, notamment tout ce qui a trait au "hot spot" : http://java.sun.com/products/hotspot/whitepaper.html |
|
|
00
|
|
|
#82 |
|
Membre à l'essai
![]() Inscription : août 2006 Messages : 56 ![]() |
Je n'ai pas de lien sous la main pour étayer ces chiffres, mais fais des recherches de bench comparatifs (Java/C++) et tu verra des chiffres dans ces eaux là.
De toute façon tout dépend du type d'application que l'on utilise pour le test. Sur une application comme un serveur HTTP il n'y aura pratiquement aucune diff entre l'implémentation Java et celle en C++. Par contre un prog de compression ou de traitement d'image pourra être facilement 2 voir 3 fois plus rapide en C++. |
|
|
00
|
|
|
#83 | |||
![]() ![]() Développeur Java/Web Inscription : avril 2002 Messages : 12 460 ![]() |
Citation:
Bien sûr il reste un obstacle pour le temps-réel. Mais ces petites optimisations (calculs sur les pointeurs) font gagner que si elles sont utilisée de manières abusives, ce qui est rarement le cas dans une application standard... Quand au 10-15%, je pense qu'ils peuvent être dans les deux sens selon les cas de figure... Citation:
Citation:
Quand à l'OutOfMemory, elle ne survient normalement qu'après que le GC ait tenté de libérer tout ce qu'il lui était possible... a++
__________________
adiGuba [ tutoriels | blog | twitter ] Rédacteur/Modérateur Java |
|||
|
00
|
|
|
#84 |
|
Membre à l'essai
![]() Inscription : août 2006 Messages : 56 ![]() |
Peut être qu'une simple méthode pour forcer le GC à libérer une instance imédiatement suffirait à contenter tout le monde.
Ceux qui ne veulent pas s'emmerder (en attendant les emmerdes |
|
|
00
|
|
|
#85 | |
|
Membre à l'essai
![]() Inscription : août 2006 Messages : 56 ![]() |
Citation:
Ce qui me manque le plus c'est les tableaux de struct...infiniment plus performants et économes en mémoire que des ArrayList de pointeurs vers des instances... |
|
|
|
00
|
|
|
#86 | |
|
Membre émérite
![]() Inscription : mars 2005 Messages : 1 065 ![]() |
Citation:
Temps de dev et fiabilité = lis mieux ce qui est marqué en dessous. Comme je l'ai dit, C++ n'est pas 100% orienté objet (polymorphisme impossible à moins de prévoir sa programmation rien que pour ca + pas toujours facile à gérer et il faut bien connaitre) tandis que le java l'est (polymorphisme toujours possible à moins de mettre des classes/méthodes en final). Je répondrais donc par une question: mets tu en doutes l'utilité de l'orienté objet pour ce qui est de rendre les programmes plus rapides à programmer et plus fiables ou penses tu qu'il y a un autre moyen d'arriver au même résultat avec une gestion de la mémoire différente? Dans ce dernier cas j'aimerais savoir quoi. |
|
|
|
00
|
|
|
#87 | |
|
Invité régulier
![]() |
Citation:
comme on ne controle pas le moment ou le GC libère la mémoire, sur des systemes ayant peu de memoire (comme un appareil mobile, ou une puce) il se peut qu'a un moment, on ai decidé de libérer cette memoire pour l'utiliser pour autre chose, mais cette place n'est pas forcement libérée... au moment ou on appelle le destructeur. et c'est a ce moment qu'on a un out of memory. de plus, si je ne m'abuse, le GC libere juste la memoire, mais ne la range pas, cad, on a 20 "cases" a liberer, et bien si le GC voit que la case 3 et la 7 sont liberable, il va effectivement libere mais si plus tard on a besoin de 2 cases contigues, pour reorganiser cela, c'est plus dur sans acces direct a la memoire. J'ai cru effetivement lire qu'il y avait une methode en dotNET pour collecter, et donc vider la collecte précédente. mais je ne suis pas sur de cette info |
|
|
|
00
|
|
|
#88 | |||
|
Expert Confirmé
![]() ![]() |
Citation:
Code :
__________________
Fremy Pour vos développements Web et une navigation agréable, le tout gratuit : 1) IE 8 + IE7Pro (Si vous ne connaissez pas IE7Pro, essayez !) 2) FF 3 + Web Developper Toolbar + AdBlockPlus + FireBug + GreaseMonkey |
|||
|
|
00
|
|
|
#89 |
|
Membre éclairé
![]() Inscription : février 2004 Messages : 500 ![]() |
Hello tout le monde..
Ce sujet à l'aire très intéressant et je n'ai pas eu encore le temps de tout lire ! Je sais pas si sa a déjà été dit mais un j'avais lu une fois un document qui disait qu'un programme utilisant un GC était généralement plus rapide que si c'est le programmeur qui s'occupe de la mémoire ! Je parle pour les moyennes et grande application ! De plus y a beaucoup moins de risque de fuite de mémoire !!! Alors pkoi s'en priver !!!! |
|
|
00
|
|
|
#90 | |
|
Expert Confirmé
![]() ![]() |
Citation:
Pour plus d'informations sur le GC de DotNet :
__________________
Fremy Pour vos développements Web et une navigation agréable, le tout gratuit : 1) IE 8 + IE7Pro (Si vous ne connaissez pas IE7Pro, essayez !) 2) FF 3 + Web Developper Toolbar + AdBlockPlus + FireBug + GreaseMonkey |
|
|
|
00
|
|
|
#91 | |||
|
Membre à l'essai
![]() Inscription : août 2006 Messages : 56 ![]() |
Citation:
Si tu perd 25% de vitesse à cause du langage tu dois dimensionner ton infra avec 25% de puissance en plus... Plus de machines à acheter, plus de maintenance...etc. Citation:
En fait la fiabilité d'une application est essentiellement liée à la rigueur des "procédures" utilisées par l'équipe de dev. Le GC ne permet pas de gagner du temps de dev. Ecrire un delete pour chaque new ne prend pas de temps. Les tenants du GC disent qu'un développeur moyen fera moins d'erreur qu'en gérant la mémoire à la main à la sauce C++. Le pb c'est que ce même dévelopeur moyen, se croyant libéré de tout pb de gestion de la mémoire grâce au GC ne fera plus du tout attention...avec des conséquences identiques. Citation:
Mais pour une bonne gestion de la mémoire, rien ne vaut deux hémisphères en bon ordre de marche. En fait ce qui me manque c'est juste une vrai méthode : System.gc.delete(ref); |
|||
|
|
00
|
|
|
#92 | |||||
|
Expert Confirmé Sénior
![]() ![]() Inscription : août 2003 Messages : 4 325 ![]() |
Citation:
Je ne vois pas le rapport avec le garbage collector. Quand on fait des buffers owerflow, le GC ne va rien changer. Un algo faux reste faux quelque soit le langage. Par contre, les structures tableau d'un langage ou d'un autre vont pouvoir réaliser des vérifications statiques ou dynamiques. En C++, tu as de quoi faire avec std::string et std::vector. Il est possible de rajouter simplement des éléments, et de payer une vérification de bornes si on le désire, même en mode release, en utilisant leur fonction membre at() plutôt que l'opérateur []. Citation:
Code :
Citation:
<pinaillages HS, suite aux remarques de zais_ethael> PS: Java n'est pas 100% objet (vive les types primitifs), et le 1.5 l'est encore moins qu'avant (vive les generics qui sont les représentants d'un autre polymorphisme, même s'il ne s'agit que d'un sucre syntaxique dans le cas du Java). C++ n'est pas 100% objet, et j'en suis bien content. Mais. 1- ce n'est pas le débat. 2- ce n'est pas le plus important dans un projet. PPS: ce n'est pas parce que l'on peut supplanter une fonction membre que cela a du sens dans le paradigme objet. Une liste ne fera jamais une bonne classe de base pour définir une liste triée. On n'a pas déjà eu cette conversation tous les deux ? </>
__________________
FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++ Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. |
|||||
|
|
00
|
|
|
#93 | |||||||
![]() ![]() Développeur Java/Web Inscription : avril 2002 Messages : 12 460 ![]() |
Citation:
D'après ce que j'ai compris la méthode System.GC.SuppressFinalize() permet simplement d'indiquer au GC ne ne pas "finalizé" l'objet car on l'a déjà fait. Donc on "détruit" bien l'objet, mais on ne le libère pas de la mémoire (c'est le GC qui s'en chargera). Donc cela donnerait en C# (excusez-moi d'avance si je me trompe) : Code :
Code :
On se retrouve à peu de chose près dans le même cas de figure... Citation:
Citation:
a++
__________________
adiGuba [ tutoriels | blog | twitter ] Rédacteur/Modérateur Java |
|||||||
|
00
|
|
|
#94 | |
|
Invité régulier
![]() Inscription : janvier 2006 Messages : 9 ![]() |
Citation:
Personnellement, j'opterai plutôt pour une méthode collecte rapide System.gc.fastCollect(); ou mieux (mais là je rêve) System.gc.fastCollect(CollectConstraints); qui permettrait de spécifier quelques contraintes lors de la collecte (temps d'exécution max, mémoire mini à récupérer, etc.) |
|
|
|
00
|
|
|
#95 | |
![]() ![]() Développeur Java/Web Inscription : avril 2002 Messages : 12 460 ![]() |
Citation:
Je viens de tomber sur cette RFE qui propose quelque chose de similaire en proposant la possibilité de déclarer des variables locales de la manières suivantes : Le transient indiquant que la durée de vie de l'objet ne dépassera pas celle de la méthode appellante. Cela impliquerait une destruction + libération de l'objet à la fin de la méthode ou du bloc (comme en C++). Seulement cela demande beaucoups de modification, car les méthodes devront être adapté pour indiquer si elles acceptent des objets "transient" ou pas... et finalement cela compliquerait beaucoups de chose pour avoir du code sécurisé... a++
__________________
adiGuba [ tutoriels | blog | twitter ] Rédacteur/Modérateur Java |
|
|
00
|
|
|
#96 |
|
Membre expérimenté
![]() |
Il y a eu des remarques interressantes.
Nottament le ramassage d'un graphe de references entier (par bloc). En effet ce procédé est trés efficace par exemple pour un serveur J2EE. Puisqu'une fois que le serveur à atteint son rythme de croisière la taille du tas ne bouge "quasiment" plus et la libération mémoire par le GC deviennent trés rapides (idem pour les allocations). Car la JVM conserve la place "inutilisé" dans le tas. Et le GC évite effectivement une trop grande ségmentation (et donc réutilisation plus efficace de la place libre dans le tas). Maintenant la remarque du J2ME m'a troublé, car effectivement dans le domaine de l'embarqué un GC() peut devenir pénible j'en conviens. Il y a 6 ans j'ai joué (en stage) sur un produit embarqué qui possédait quelques 100 de Ko de ROM et quelques Ko de RAM. A cette époque nous n'aurions pas aimé ne pas controler la mémoire à l'octet prêt. Mais maintenant même les produits embarqué possédent plusieurs Mo (ca à bcp évolués en 6 ans) mais je pense que la gestion de la mémoire reste un élément critique. Donc mon bilan est le suivant: Domaine d'application où le GC est une force - Application J2EE (execution de longue durée) - Application StandAlone Domaine d'application où le GC est néfaste ou problèmatique - J2ME (produits embarqués) - Produits à contrainte Temps Réel |
|
|
00
|
|
|
#97 |
![]() ![]() |
Bonjour,
Vous parlez de performances, rapidité de développement, focalisation sur le code métier. J'aime bien prendre l'exemple python. (ça pourrait être java) Python dispose d'un gc comme java, .net. Les performances de python sont très acceptable. Cependant, si on souhaite des meilleurs performances sur un bout de code, on peut utiliser swig. (ça marche pour de nombreux langages dont java) Vous avez votre bout de code C/C++ pour: - des raisons de performances - du temps réel - reprendre une bibliothèque existante Il y'a des inconvénients: - apprendre à utiliser swig - "complexification" en ajoutant un langage J'aime bien ce principe. Plus on se situe haut, plus on risque d'avoir des pertes. Mais il y'a la possibilité de "redescendre". PS: quand je développais en C/C++, je me souviens des problèmes de debug sur des programmes complexes avec thread, mutex, semaphores, condition... Même avec efence, valgrind, gdb... c'était des fois très dur de situer le problème. On peut être le meilleur développeur du monde et avoir des fuites mémoires. (fuites qui créent des bugs aléatoires des fois)
__________________
Redacteur LINUX FAQ LINUX Installateur pour mplayer Java: cryptographie avec bouncycastle |
|
|
00
|
|
|
#98 | ||
|
Membre émérite
![]() Inscription : mars 2005 Messages : 1 065 ![]() |
Citation:
Citation:
|
||
|
|
00
|
|
|
#99 | |
|
Invité(e)
Messages : n/a ![]() |
Citation:
Si pour n'importe quelle opération il y a des controles en interne pour déterminer s'il y a exception il ya de chances qu'à l'exécution le programme en Java soit lent |
|
00
|
|
|
#100 | |||
|
Membre à l'essai
![]() Inscription : août 2006 Messages : 56 ![]() |
Citation:
Un GC ne fait rien gagner du tout en temps ! Citation:
J'ai vu de très gros prog C++ extrèmement faciles à maintenir...et des bouzes infame en Java...et vice versa. Citation:
MAIS ce ne sont pas des API standard et c'est ça qui fait toute la différence. En Java, tu prends le JDK tout est là ou presque, tu te pose pas 50 mille questions avant de commencer. En C++ tu passe ton temps à tourner en rond entre : recherche/apprentissage/tests...recherche/apprentissage/tests... Et finalement chéquier...car la seule API valable est toujours hors de prix ! Ou alors (très souvent) tu prends ton clavier, ton courage à deux main et tu te fais ta lib perso. |
|||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com