web-dev-qa-db-fra.com

Est-ce que Java est vraiment lent?

Java a n certain degré de réputation d'être lent .

  • Est-ce que Java est vraiment lent?
  • Si oui pourquoi? Où est (ou était) le goulot d'étranglement? Est-ce à cause de JVM inefficaces? Collecte des ordures? Bibliothèques de bytecode pures au lieu de code C enveloppé par JNI? Beaucoup d'autres langues ont ces fonctionnalités, mais elles n'ont pas cette réputation de lenteur.
181
Stefano Borini

Le langage moderne Java est l’un des langages les plus rapides, même s’il s’agit toujours d’une mémoire volante. Java avait == == une réputation d'être lent parce que cela prenait longtemps à la VM Commencez.

Si vous pensez toujours que Java est lent, voir le jeu de tests de performance résultats. Un code parfaitement optimisé écrit dans un langage compilé à l’avance (C, Fortran, etc.) peut le battre; Cependant, Java peut être plus de 10 fois plus rapide que PHP, Ruby, Python, etc. Il existe des domaines spécifiques où il peut battre les langages compilés courants (s'ils utilisent des bibliothèques standard).

Il n'y a aucune excuse pour les applications "lentes" Java maintenant. Les développeurs et les codes/bibliothèques hérités sont à blâmer, bien plus que le langage. En outre, blâmer tout ce qui touche "l'entreprise".

En toute justice pour la foule "Java is slow", voici les zones où il est encore lent (mises à jour pour 2013):

  • Les bibliothèques sont souvent écrites pour leur "exactitude" et leur lisibilité, et non pour leurs performances. À mon avis, c'est la principale raison pour laquelle Java a toujours une mauvaise réputation, en particulier côté serveur. Cela aggrave les problèmes de chaîne de manière exponentielle. Certaines erreurs simples sont courantes: les objets sont souvent utilisés à la place des primitives, ce qui réduit les performances et augmente l'utilisation de la mémoire. De nombreuses bibliothèques Java (y compris les bibliothèques standard) créent fréquemment des chaînes de caractères, plutôt que de réutiliser des formats mutables ou plus simples (char [] ou StringBuffer). Ceci est lent et crée des tonnes de déchets à collecter plus tard. Pour résoudre ce problème, je suggère aux développeurs d'utiliser des collections primitives et en particulier les bibliothèques de Javalution, si possible.

  • Les opérations sur les chaînes sont un peu lentes. Java utilise des objets chaîne immuables, TF-16 -. Cela signifie que vous avez besoin de plus de mémoire, d'un plus grand accès à la mémoire et que certaines opérations sont plus complexes qu'avec ASCII (C, C++). À l’époque, c’était la décision de portabilité right , mais son coût en termes de performances était faible. TF-8 semble être un meilleur choix maintenant.

  • L'accès aux tableaux est un peu plus lent que C, à cause des contrôles de limites. Auparavant, la pénalité était grande, mais elle est maintenant réduite (Java 7 optimise beaucoup de contrôles de limites redondants).

  • Le manque d'accès arbitraire à la mémoire peut ralentir certaines opérations d'E/S et de traitement au niveau du bit (compression/décompression par exemple). Ceci est une fonctionnalité de sécurité de la plupart des langages de haut niveau maintenant.

  • Java utilise BEAUCOUP plus de mémoire que C, et si votre application est liée à la mémoire ou à la bande passante (mise en cache, etc.), cela la ralentit. Le revers de la médaille est que l’allocation/désallocation est extrêmement rapide (hautement optimisée). Ceci est une fonctionnalité de la plupart des langages de haut niveau actuellement, et en raison des objets et de l'utilisation de GC plutôt que de l'allocation de mémoire explicite. Plus de mauvaises décisions de bibliothèque.

  • Les E/S basées sur les flux sont lentes en raison du fait que (OMI, mauvais choix) nécessite la synchronisation sur chaque accès aux flux. NIO corrigé cela, mais c'est pénible à utiliser. On peut contourner ce problème en lisant/écrivant dans un tableau, au lieu d’un élément à la fois.

  • Java ne fournit pas la même fonctionnalité de bas niveau que C,, vous ne pouvez donc pas utiliser les astuces de l'assembleur intégré en ligne pour accélérer certaines opérations. Ceci fournit la portabilité et est une fonctionnalité de la plupart des langages de haut niveau maintenant.

  • Il est fréquent de voir Java applications liées à de très anciennes versions de JVM. Surtout côté serveur. Ces anciennes machines JVM peuvent être incroyablement inefficaces par rapport aux dernières versions.

En fin de compte, Java a été conçu pour assurer la sécurité et la portabilité au détriment des performances et des opérations très exigeantes. La plupart de sa réputation de lenteur n'est plus méritée.


Cependant, il existe plusieurs endroits où Java est plus rapide que la plupart des autres langages:

  • L'allocation et la désaffectation de mémoire sont rapides et peu coûteuses. J'ai déjà vu des cas où il est 20% plus rapide (ou plus!) D'allouer un nouveau tableau de plusieurs Ko que de réutiliser un tableau en cache.

  • L'instanciation d'objet et les fonctionnalités orientées objet sont extrêmement rapides à utiliser (plus rapide que le C++ dans certains cas), car elles ont été conçues dès le début. Cela provient en partie d'une bonne répartition plutôt que d'une attribution explicite (qui convient davantage à de nombreuses attributions de petits objets). On peut coder C qui bat cela (en lançant la gestion de mémoire personnalisée et en faisant malloc efficacement), mais ce n’est pas facile.

  • Les appels de méthode sont fondamentalement gratuits et, dans certains cas, plus rapides que le code de méthode volumineuse. Le compilateur HotSpot utilise les informations d'exécution pour optimiser les appels de méthode et dispose d'une mise en ligne très efficace. En utilisant les informations d'exécution supplémentaires, il peut parfois surpasser les compilateurs en avance sur le temps et même (dans de rares cas) l'insertion manuelle. Comparez au C/C++, où les appels de méthode entraînent une légère pénalité de performance si le compilateur décide de ne pas s'inscrire en ligne.

  • La synchronisation et le multi-threading sont simples et efficaces. Java a été conçu pour prendre en compte les threads dès le début, et cela se voit. Les ordinateurs modernes disposent généralement de plusieurs cœurs et, comme le thread est intégré au langage, vous pouvez facilement en tirer parti. En gros, un gain de vitesse supplémentaire de 100% à 300% par rapport au code C standard à un seul thread. Oui, des threads et des bibliothèques en C soigneusement écrits peuvent le battre, mais cela représente beaucoup de travail supplémentaire pour le programmeur.

  • Les chaînes incluent la longueur: certaines opérations sont plus rapides. Cela bat avec des chaînes délimitées par des caractères nuls (commun en C). Dans Java 7, Oracle a supprimé l'optimisation String.subString (), car les utilisateurs l'utilisaient bêtement et avaient des fuites de mémoire.

  • La copie du tableau est hautement optimisée. Dans les dernières versions, Java utilise un assembleur réglé manuellement pour System.arraycopy. Le résultat est que dans les opérations arraycopy/memcopy-heavy, j'ai vu mon code battre l'équivalent en C par des marges raisonnables.

  • Le ​​compilateur JIT est intelligent pour utiliser L1/L2 cache. Les programmes compilés à l'avance ne peuvent pas modifier leur code en temps réel en fonction du processeur et du système sur lesquels ils s'exécutent. JIT fournit de cette manière des transformations de boucle très efficaces.

Quelques autres faits historiques ont contribué à la réputation de "Java is slow":

  • Avant la compilation JIT (Java 1.2/1.3), le langage était uniquement interprété, non compilé, et donc très lent.
  • La compilation de JIT a pris du temps pour devenir efficace (améliorations majeures avec chaque version)
  • Le chargement de classe est devenu beaucoup plus efficace au fil des ans. Auparavant, il était plutôt inefficace et lent au démarrage.
  • Swing et le code de l'interface utilisateur n'utilisait pas très bien le matériel graphique natif.
  • Swing est simplement affreux. Je blâme AWT et Swing pour avoir expliqué pourquoi Java n'a jamais été retenu pour le bureau.
  • Utilisation intensive de la synchronisation dans les classes de la bibliothèque; les versions non synchronisées sont maintenant disponibles
  • Le chargement des applets prend une éternité, à cause de la transmission d'un --- JAR sur le réseau et du chargement de la VM au démarrage.
  • La synchronisation entraînait de lourdes pertes de performances (elle a été optimisée avec chaque version Java). La réflexion reste toutefois coûteuse.
236
BobMcGee

Initialement Java n’était pas particulièrement rapide, mais il n’est pas trop lent non plus. Ces jours-ci, Java est très rapide. Des personnes à qui j'ai parlé impression de Java être lent vient de deux choses:

  1. Lent VM heure de démarrage. La première implémentation Java a pris beaucoup de temps pour démarrer et charger les bibliothèques requises et l'application par rapport aux applications natives.

  2. Interface utilisateur lente. Early Swing était lent. Cela n’a probablement pas aidé la plupart des utilisateurs de Windows à trouver le vilain défaut Metal L & F.

Compte tenu de ce qui précède, il n’est pas étonnant que les gens aient eu l’impression "Java est lent".

Pour les utilisateurs ou les développeurs habitués au développement d’applications natives, voire Visual Basic applications, ces deux points sont la chose la plus visible dans une application, et c’est la première impression que vous obtiendrez sur une application (à moins une application non graphique, auquel cas seul le 1. s’applique.).

Vous ne convaincrez pas un utilisateur "d'exécuter le code très rapidement" lorsque le démarrage de l'application prend 8 secondes par rapport à son ancienne application Visual Basic qui démarre immédiatement, même si l'exécution du code et le temps de démarrage risquent de ne pas être connectés du tout.

Détruire la première impression est un excellent moyen de créer des rumeurs et des mythes. Et les rumeurs et les mythes sont difficiles à tuer.

En bref, Java n’est pas lent. Les personnes ayant l’attitude "Java est lente" sont basées sur les premières impressions de Java il ya plus de 10 ans.).

49
nos

Après avoir lu une page pleine de commentaires disant Java n’est pas lent, il me suffit de répondre avec un avis différent.

La lenteur d'une langue dépend beaucoup de vos attentes en matière de rapidité. Si vous considérez que C # est rapide, Java l'est sûrement aussi. Si votre domaine problématique est lié aux bases de données ou à un traitement en temps réel, Java est sûrement assez rapide aussi. Si vous êtes disposé à faire évoluer votre application en ajoutant plus de matériel, Java est probablement rapide pour vous. Si vous considérez qu'un facteur d'accélération constant sur une échelle de 5 à 10 est isn Ne vaut pas la peine, vous envisagez probablement Java rapide.

Si vous effectuez un calcul numérique sur de grands ensembles de données ou si vous êtes lié à un environnement d'exécution, où les ressources de la CPU sont limitées, une accélération constante sur une échelle de 5 à 10 serait énorme. Même une accélération de 0,5 pourrait signifier une réduction de 500 heures pour que le calcul se termine. Dans ces cas-là, Java ne vous permet tout simplement pas d'obtenir les dernières performances, et vous considérerez probablement que Java est lent.).

40
Sami

Vous semblez poser deux questions assez différentes:

  1. Est-ce que Java est vraiment lent, et si oui pourquoi?
  2. Pourquoi Java est-il perçu comme étant lent, même s’il est plus rapide que beaucoup d’autres solutions?

La première de ces questions est plus ou moins une question du type "combien de temps dure une corde". Cela revient à votre définition de "lent". Comparé à un interpréteur pur, Java est extrêmement rapide. Comparé à d'autres langages compilés (normalement) sous une forme quelconque de bytecode, puis compilés dynamiquement en code machine (par exemple, C # ou autre). NET) Java est à peu près sur un pied d'égalité. Comparé aux langages qui sont normalement compilés en code machine pur, et ont des équipes (souvent nombreuses) de personnes travaillant uniquement sur l'amélioration de leurs optimiseurs (par exemple, C , C++, Fortran, Ada) Java réussit plutôt bien à un pe choses, mais dans l'ensemble, il a tendance à être au moins un peu plus lent.

Cela est en grande partie lié à la mise en œuvre. En gros, il s'agit du fait qu'un utilisateur attend pendant qu'un compilateur dynamique/JIT s'exécute. Ainsi, à moins que vous n'ayez un programme qui s'exécute pendant un certain temps, c'est difficile de justifier que le compilateur passe beaucoup de temps sur des optimisations difficiles. Par conséquent, la plupart des compilateurs Java (et C #, etc.) ne mettent pas beaucoup d'efforts dans des optimisations vraiment difficiles. Dans de nombreux cas, le choix de l'optimisation est moins important que celui où De nombreux problèmes d'optimisation sont NP terminés, de sorte que leur temps de traitement augmente rapidement avec la taille du problème attaqué. Une façon de respecter le temps imparti consiste simplement à appliquer l'optimisation à Une seule fonction à la fois, lorsque le développeur attend le compilateur, vous pouvez vous permettre de prendre beaucoup plus de temps et d'appliquer la même optimisation à des fragments beaucoup plus volumineux du programme. poilue (et peut donc être assez grosse). Encore une fois, étant donné que l'utilisateur attend pendant le chargement du code (et que le temps de démarrage de la machine virtuelle est souvent un facteur important dans le temps total), la mise en œuvre doit équilibrer le gain de temps au même endroit perdu dans un autre - et compte tenu du peu de code qui profite des optimisations poilues, il La JVM Small est généralement plus bénéfique.

Un deuxième problème est qu'avec Java, vous obtenez souvent un type de solution plus ou moins "one size fits all". Par exemple, pour de nombreux Java, Swing est essentiellement la bibliothèque niquement = disponible). En C++, il existe littéralement des dizaines de bibliothèques, de structures d'application, etc. ., chacun avec son propre ensemble de compromis entre facilité d’utilisation et exécution rapide, apparence homogène, apparence native, etc. Le seul point qui fait problème, c’est que certains (par exemple, Qt) peuvent être assez coûteux ( au moins pour un usage commercial).

Troisièmement, beaucoup de code écrit en C++ (et encore plus en C) est simplement plus ancien et plus mature. Une bonne partie de celle-ci contient un noyau de routines écrites il y a plusieurs décennies, lorsque passer du temps supplémentaire à optimiser le code était le comportement normal et attendu. Cela a souvent un avantage réel avec un code plus petit et plus rapide. C++ (ou C) tire son crédit du fait que le code est petit et rapide, mais il s'agit en réalité beaucoup plus d'un produit du développeur et des contraintes liées à l'époque où le code a été écrit. Dans une certaine mesure, cela conduit à une prophétie auto-réalisatrice: lorsque les utilisateurs se préoccupent de la vitesse, ils choisissent souvent le C++ en raison de sa réputation. Ils consacrent plus de temps et d’efforts à l’optimisation, et une nouvelle génération de code C++ rapide est écrite.

Pour résumer, l’implémentation normale de Java rend l’optimisation maximale problématique au mieux. Pire, où Java est visible, comme Les kits d'outils de fenêtrage et le temps de démarrage de la machine virtuelle Java jouent souvent un rôle plus important que la vitesse d'exécution du langage lui-même: dans de nombreux cas, C et C++ bénéficient également du mérite de ce qui est réellement le produit de l'optimisation.

En ce qui concerne la deuxième question, je pense que c'est en grande partie une question de nature humaine au travail. Quelques zélotes font des affirmations plutôt exagérées sur le fait que Java est incroyablement rapide. Quelqu'un le tente et découvre que même un programme trivial prend quelques secondes à démarrer et se sent lent et maladroit quand il le fait. Peu de gens essaient probablement d’analyser les choses pour se rendre compte qu’il s’agit en grande partie du temps de démarrage de la machine virtuelle Java et du fait que lorsqu’ils essaient pour la première fois, aucun code n’a encore été compilé - une partie du code est en cours de compilation. Pire, même s’il est suffisamment rapide, l’apparence et la convivialité paraîtront généralement étranges et maladroites pour la plupart des utilisateurs, de sorte que même si les mesures objectives indiquaient des temps de réponse rapides, elles sembleraient quand même maladroites.

En les combinant, on obtient une réaction assez simple et naturelle: Java est lent, moche et maladroit. Compte tenu du battage médiatique qui dit que c'est très rapide, il y a une tendance à surréagir et à en conclure que - horriblement lent, au lieu d'un (plus précis) "légèrement plus lent, et ce dans des circonstances particulières." C'est généralement le pire des cas pour un développeur écrivant les premiers programmes dans la langue. Exécution d'un " hello world "dans la plupart des langues semble instantané, mais en Java, il y a une pause facilement perceptible au démarrage de la machine virtuelle Java. Même un interpréteur pur fonctionnant beaucoup plus lentement sur des boucles serrées apparaître plus rapidement pour un code comme celui-ci, tout simplement parce qu'il peut être chargé et commencer à s'exécuter un peu plus tôt.

33
Jerry Coffin

Il s'agit d'informations obsolètes datant des débuts (du milieu à la fin des années 1990) de Java. Chaque version majeure de Java a introduit des améliorations considérables par rapport à la version précédente. Oracle fusionnant apparemment avec JRVMit et la machine virtuelle Java de Sun pour Java 7, cette tendance semble mis à continuer.

Comparé à beaucoup d'autres langages modernes populaires (Python, Ruby, PHP), Java est en réalité nettement plus rapide pour la plupart des utilisations. Il ne correspond pas vraiment au C ou C++, mais il est assez proche pour de nombreuses tâches. Les véritables problèmes de performances devraient concerner la quantité de mémoire utilisée.

16
Dan Dyer

Java est vraiment lent, surtout pour le travail quantitatif.

J'utilise une combinaison de R , Python et C/C++ avec multithread optimisé ] ATLAS Dans chacun de ces langages, je peux matricier multiplier une matrice de doubles 3000 par 3000 avec elle-même en environ 4 secondes.En utilisant Colt et Parallel Colt en Java, la même opération dure 185 secondes! malgré ces Java bibliothèques étant de nature parallèle.

Donc, au total, pure Java ne convient pas pour un travail quantitatif. Jblas semble être la meilleure bibliothèque d'algèbre linéaire pour Java car il utilise ATLAS.

Ma machine est un HP Core 2 Duo avec 3 Go de RAM. J'utilise 64 bits buntu 10.04 (Lucid Lynx).

14
Hamaad Shah

Le principal coupable dans le "temps de démarrage long" est la liaison dynamique. Une application Java est constituée de classes compilées. Chaque classe référence d'autres classes (pour les types d'argument, les appels de méthode ...) par name. La machine virtuelle Java doit examiner et faire correspondre ces classes. Noms incrémentaux, ne faisant que les parties dont il a besoin à un moment donné, mais cela reste du travail à faire.

Dans une application C, cette phase de liaison a lieu à la fin de la compilation. C'est lent, surtout pour les grosses applications, mais seul le développeur le voit. La liaison donne un fichier exécutable que le système d'exploitation doit simplement charger RAM "tel quel".

En Java, la liaison se produit chaque fois que l'application est exécutée. D'où le long temps de démarrage.

Diverses optimisations ont été appliquées, y compris des techniques de mise en cache, et les ordinateurs deviennent plus rapides (et "plus rapidement que les applications", "plus gros"), de sorte que l'importance du problème a beaucoup diminué ces derniers temps; mais le vieux préjugé reste.

En ce qui concerne les performances par la suite, mes propres tests de performance sur les calculs compacts avec accès aux tableaux (principalement des fonctions de hachage et d’autres algorithmes de chiffrement) montrent généralement que le code C optimisé est environ 3 fois plus rapide que Java; parfois, C n’est que 30% plus rapide que Java, parfois C peut être 4x plus rapide, en fonction de l'algorithme mis en œuvre.J'ai vu un facteur 10x lorsque le code "C" était en réalité Assembly pour arithmétique à gros nombres entiers, en raison des opcodes de multiplication 64x64-> 128 que le processeur Les offres mais Java ne peuvent pas être utilisées car son type entier le plus long est le long de 64 bits. Il s'agit d'un cas Edge. Dans des conditions pratiques, des considérations de largeur de bande de la mémoire et des E/S empêchent C code d'être vraiment trois fois plus rapide que Java.

14
Thomas Pornin

Pour la plupart des gens qui interagissent avec cela - Java est (...) lent lent (e). Nous avons tous vu cette tasse de café tourner sur elle-même. Il faut un certain temps avant de lancer la machine virtuelle Java et de télécharger les fichiers binaires de l’applet, ce qui a une incidence sur l’expérience utilisateur.

Cela n'aide en rien que la lenteur de la machine virtuelle JVM et du temps de téléchargement des applets porte clairement le nom d'une tasse à café Java), afin que les gens associent l'attente à Java. When Flash = le chargement prend beaucoup de temps, la marque du message "chargement" est spécifiée par le développeur Flash, afin que personne ne blâme la technologie Flash dans son ensemble.

Tout cela n'a rien à voir avec les performances de Java sur un serveur ni avec les nombreuses autres façons dont Java est utilisé en dehors du navigateur. Mais c'est ce que les gens voient et ce que les développeurs non-Java se rappellent. quand ils pensent à Java.

10
Spike Williams

Java a la réputation d'être lent, car il était lent. Les premières versions de Java avaient une compilation Just In Time médiocre ou médiocre. Cela signifiait que le code, bien que bytecode, était en cours d'interprétation, donc même pour les opérations les plus simples (comme l'ajout de deux entiers) la machine devait faire toutes sortes de comparaisons et de déréférences de pointeurs et d'appels de fonctions.Le compilateur JIT n'a cessé de s'améliorer; maintenant, c'est au point où si j'écris du code C++ négligemment et Java du code négligemment , Java dépassera parfois ) C++ parce que le compilateur JIT réalise que j'ai des déréférencements de pointeur inutiles et prend soin de moi pour moi.

Si vous voulez voir à quel point la compilation JIT fait une différence, consultez les points de repère interprétés et non interprétés sur le Jeu de référence des langages informatiques . (Pidigits utilise une bibliothèque externe pour faire tous les calculs, de sorte que le benchmark ne change pas; les autres affichent une accélération de 6-16x!)

Donc, c'est la raison principale. Il y a diverses autres raisons moins importantes qui n'ont pas réglé le problème: à l'origine, Java était lent (maintenant corrigé); les applications Web dans Java prennent beaucoup de temps à télécharger (beaucoup moins vrai maintenant avec le haut débit largement accessible, et de grandes choses comme les films sont attendus); le UI Swing n'était pas (et n'est toujours pas) écrit avec la performance à l'esprit alors il est beaucoup moins vif que les équivalents dans par exemple C++.

9
Rex Kerr

Java était lent, de retour dans la journée. Il est devenu beaucoup plus rapide, grâce à quelques générations d’améliorations des performances . La dernière fois que j'ai entendu parler, c'est généralement à moins de 10% de la vitesse de C # - parfois plus vite, parfois plus lentement.

Le démarrage de l'applet Java est toujours lent car vous devez démarrer une machine virtuelle Java entière, qui doit charger toutes ses classes. Un peu comme démarrer un autre ordinateur. Une fois la JVM démarrée, elle est assez rapide, mais le démarrage est généralement ce dont les gens se souviennent.

En outre, il y a au moins quelques personnes qui ne croiront jamais à la viabilité de Java.

6
Kaleb Brasee

Stefano:

Je suis avec Java depuis le début, de sorte que, de mon point de vue, la réputation d'être lent a été créée par des interfaces graphiques peu réactives et lentes (AWT, puis Swing) et probablement dans Applets. en raison des temps de démarrage supplémentaires lents des ordinateurs virtuels.

Java a stipulé et promu de nombreuses recherches dans le domaine VM), et de nombreuses améliorations ont été apportées, notamment le ramassage des ordures (vous pouvez en fait régler beaucoup de choses; cependant, je vois souvent l’optimisation des points chauds (qui au début et qui est probablement encore plus efficace côté serveur).

Java au niveau du backend et du calcul n’est pas si lent. Colt est l'un des meilleurs exemples:

La dernière version stable de Colt dépasse les 1,9 Gflop/s sur le JDK ibm-1.4.1, RedHat 9.0, 2x [email protected] GHz.

Il y a beaucoup de choses en dehors du grand public Java qui devraient être considérées, comme Realtime Java ou des mécanismes spéciaux pour améliorer la vitesse comme Javolution , ainsi que la compilation Ahead-Of-Time (comme gcj). En outre, il existe des circuits intégrés pouvant exécuter Java Bytecode directement, comme par exemple celui qui se trouve dans les iPhones et iPod actuels - ARM Jazelle .

Je pense qu’en général aujourd’hui, c’est une décision politique (comme non Java sur iPhone/iPod), et une décision contre Java en tant que langage (car beaucoup pense que c'est trop verbeux).

Cependant, il existe de nombreuses autres langues pour le Java VM de nos jours (par exemple, Python, Ruby, JavaScript, Groovy, Scala etc.) qui peut constituer une alternative.

Personnellement, je continue à en profiter en tant que plate-forme flexible et fiable, avec une excellente disponibilité d'outils et de bibliothèques, qui permet de travailler avec tout, du plus petit appareil (par exemple, JavaCard) aux plus gros serveurs.

6
Dieter

Un marteau est beaucoup plus lent à dérouler la pâte que de nombreux autres outils. Ne fait pas le marteau "plus lent", ni moins utile pour les tâches pour lesquelles il est conçu.

En tant que langage de programmation général, Java correspond à beaucoup (sinon à la plupart) pour un large éventail de tâches de programmation. Il existe des tests spécifiques et triviaux pour lesquels Java ne surpassera pas les solutions codées à la main dans des langages moins sophistiqués, qui sont "plus proches du métal".

Mais lorsqu'il s'agit d'applications "réelles", Java est souvent l'outil idéal. Cela dit, rien n'empêchera les développeurs de créer une solution lente utilisant N'IMPORTE QUEL outil. L'utilisation abusive d'un outil est un problème bien connu (il suffit de regarder les réputations de PHP et de VB). Cependant, la syntaxe et la conception propres de Java (en grande partie) contribuent grandement à réduire les utilisations abusives.

4
mobiGeek

Java est un langage de haut niveau et sa réputation est d’avoir une performance comparable à celle d’autres langages de haut niveau comparables.

  1. Il a liaison dynamique sémantique. Comparé au C++, où les méthodes non virtuelles sont compilées en tant qu'appels de fonction, même le meilleur compilateur Java du monde doit produire un code moins efficace. Mais c'est aussi une sémantique plus propre, de plus haut niveau.

  2. Je ne me souviens pas des détails, mais j’ai entendu dans les premiers jours de Java qu’il existait un mutex par objet Java, à acquérir et à diffuser par chaque méthode. Cela tend à le rendre mieux adapté à la concurrence, même si, malheureusement, un simple mutex par objet ne vous protégera pas des races, des impasses ou de tout ce qui peut arriver dans les programmes concurrents. Cette partie, si elle est vraie, est un peu naïve, mais elle vient de bonnes intentions. N'hésitez pas à me renseigner sur les détails si vous en savez plus sur cet aspect.

  3. Une autre façon pour laquelle Java est un langage de haut niveau consiste à avoir Garbage-Collection . Garbage-Collection peut être plus lent que malloc et free pour les programmes qui allouent en même temps toute la mémoire dont ils ont besoin et qui travaillent avec cela. Le problème est que, dans les langues ne disposant pas de Garbage-Collection, les programmeurs ont tendance à écrire uniquement des programmes qui allouent toute la mémoire dont ils ont besoin en même temps et échouent si il s'avère qu'une constante de taille maximale arbitraire a été dépassée. Donc, la comparaison est des pommes aux oranges. Lorsque les programmeurs s'efforcent d'écrire et de déboguer des programmes avec l'allocation dynamique de structures chaînées dans des langages non GC, ils constatent parfois que leurs programmes ne sont plus plus rapides que dans un langage GC, car malloc et free ne sont pas gratuits! Ils ont aussi des frais généraux ... De plus, ne pas avoir les pouvoirs du GC pour spécifier qui libère quoi, et avoir à préciser qui libère quoi à son tour, vous oblige parfois à faire des copies - lorsque plusieurs fonctions vont avoir besoin des données et qu'il est difficile de déterminer lesquelles. l'utilisera en dernier - alors que la copie n'aurait pas été nécessaire dans un langage GC.

3
Pascal Cuoq

Au milieu des années quatre-vingt-dix, lorsque Java a été adopté, le langage C++ était la langue dominante et le Web était encore relativement nouveau. De plus, les JVM et GC étaient des concepts relativement nouveaux dans le développement traditionnel. étaient assez lents (comparés au C++ fonctionnant sur du métal nu) et souffraient également de pauses parfois longues de récupération de place, ce qui a conduit à une réputation de Java étant lent.

2
Ken Liu

Comme le dit Pascal, Java est comparable à d'autres langages de haut niveau. Cependant, en tant que personne ayant travaillé avec les machines virtuelles originales sur Windows 98 , à ce moment-là, le niveau de l'abstraction fournie par la Java machine virtuelle était, dirons-nous, pénible).

En gros, c’était une émulation logicielle avec peu ou pas d’optimisation que nous prenons pour acquis aujourd’hui dans la JVM.

1
caskey

Le problème majeur avec Java applications, c’est que c’est énorme en raison de la taille importante de la bibliothèque d’exécution stock. Des programmes énormes remplissent beaucoup de mémoire et ont tendance à être échangés, ce qui signifie qu'ils deviennent lents.

La raison pour laquelle la machine virtuelle Java est volumineuse, c’est qu’elle dispose d’un très bon interprète de code octet qui permet de garder trace de beaucoup de choses. Cela signifie beaucoup de données, ce qui signifie mémoire.

Vous voudrez peut-être examiner la machine virtuelle jamvm, qui est un interpréteur raisonnablement rapide (pas de code natif) et très petite. Ça commence même vite.

1

De nombreuses Java pour le bureau (des choses comme Eclipse) ont une mauvaise réactivité de l'interface graphique, probablement en raison de la consommation de mémoire importante et du fait que le chargeur de classes peut faire beaucoup d'E/S. Cela s'améliore, mais pire encore il y a des années.

Beaucoup de gens (la plupart) aiment faire des généralisations et disent "Java est lent", car ils perçoivent que les applications sont lentes quand elles interagissent avec elles.

1
Wojciech Kaczmarek

Les gens trottent normalement la ligne "c'est interprété". Parce qu’il était une fois, et que la mauvaise presse est transmise par ceux qui ont jeté Java comme "trop ​​lent" et n’est jamais revenu pour tester de nouvelles versions.

Ou peut-être que "les gens sont des idiots" est une meilleure réponse.

0
Mr. Boy

Je pense qu'un jour, peut-être pas dans un avenir trop proche, les langages compilés par JIT dépasseront tous les aspects des langages compilés (enfin, peut-être pas le temps de démarrage/la consommation de mémoire) car les compilateurs JIT peuvent fortement utiliser l'exécution comportement et la plate-forme sur laquelle ils fonctionnent.

0
helpermethod