web-dev-qa-db-fra.com

Analyse comparative des performances sur Java VM vs .NET CLR

Avez-vous déjà dû justifier le choix d'utiliser .NET au lieu de Java basé sur les performances?

Pour un système de traitement de transactions à volume élevé typique qui peut effectuer les opérations suivantes,

  • Transactions de base de données simultanées
  • Calculs mathématiques
  • Interaction avec d'autres services Web (SOAP/XML, XML-RPC)

Mon approche serait de coder des tests de référence dans les deux Java pour la JVM et C # pour .NET CLR qui comparent les opérations ci-dessus sous différents niveaux de charge et comparer les résultats.

Mis à part les préférences de langue et de plate-forme, je suis curieux de savoir comment procéder pour faire une comparaison concluante des performances entre les Java VM et .NET CLR?

Existe-t-il des repères complets et respectés?

37
bunn_online

Je n'ai pas de chiffres exacts sur l'efficacité de la JVM par rapport au CLR, mais la différence, le cas échéant, est probablement faible.

Cependant, du côté du langage, C # a quelques constructions de plus bas niveau que Java, ce qui permettrait plus d'optimisation.

Des constructions telles que:

  • Types de valeurs définis par l'utilisateur. Rapide à allouer, pas de surcharge mémoire (qui est de 12 octets par type de référence dans le CLR et la JVM si je me souviens bien). Utile pour les choses qui se laissent naturellement exprimer sous forme de valeurs, comme les vecteurs et les matrices. Donc des opérations mathématiques. Combinez cela avec ref et out pour éviter une copie excessive de ces types de grande valeur.

  • Blocs de code dangereux qui permettent une optimisation un peu plus proche du métal. Par exemple, bien que le CLR et la JVM puissent éviter les vérifications des limites du tableau dans certaines situations, dans de nombreux cas, ils ne le peuvent pas et chaque accès au tableau nécessite une vérification si l'index se trouve toujours dans les limites du tableau. L'utilisation de code dangereux ici vous permet d'accéder directement à la mémoire du tableau avec des pointeurs et de contourner les vérifications de limites. Cela peut signifier une économie importante. Et du côté très bas niveau, il y a aussi stackalloc qui vous permet d'allouer des tableaux directement sur la pile, alors qu'un tableau normal est alloué sur le tas, ce qui est plus lent, mais aussi plus pratique. Personnellement, je ne connais aucune application pratique de stackalloc.

  • Véritables génériques, contrairement aux génériques à effacement de type de Java, évitant le casting et la boxe inutiles. Mais si c'est un problème dans votre programme Java, il peut facilement être résolu avec un travail supplémentaire (en passant par exemple d'un ArrayList<Integer> vers un type personnalisé qui utilise en interne un int[] tampon.)

Tout cela semble biaisé vers C # et je pense que C # a de meilleures constructions de langage de bas niveau disponibles qui peuvent aider à la performance. Cependant, je doute que ces différences importent vraiment (et qu'elles ne s'appliquent même pas dans votre cas, l'utilisation de pointeurs ne vous rapporte rien si tout ce que vous faites est l'accès à la base de données, où Java pourrait être plus rapide) si le choix vous empêche d'une autre manière (comme passer à une plateforme croisée). Optez pour l'exactitude, la plateforme qui correspond à vos besoins, plutôt que des différences de performances mineures.

35
JulianR

une comparaison de performances concluante entre le Java VM et .Net CLR est un rêve de pipe. Vous pouvez toujours faire un test de performance qui rendra l'un meilleur que l'autre car l'ingénierie d'un système complexe implique toujours des compromis. Si vous restreignez le type de benchmarks à la vitesse d'exécution et à la mémoire vous pourriez trouver des articles comme celui-ci: http://www.codeproject.com/KB/dotnet/RuntimePerformance.aspx ce n'est en aucun cas la fin du débat.

3
dmihailescu

Mis à part les préférences de langue et de plate-forme, je suis intéressé à savoir comment vous pourriez procéder pour faire une comparaison concluante des performances entre le Java VM et .Net CLR?

J'écrirais une suite de tests de référence conçus pour vous permettre de comparer différentes caractéristiques différentes des deux machines virtuelles et de leurs bibliothèques standard. Mon expertise est en informatique technique, je recommanderais donc ce qui suit:

  • En registre arithmétique entier, par ex. Fibonacci.
  • En registre arithmétique à virgule flottante, par ex. mandelbrot.
  • Itération de tableau, par ex. FFT.
  • Répartition, par ex. arbres rouge-noir purement fonctionnels.
  • Tables de hachage avec clés et valeurs int ou float.
  • Tables de hachage avec clés et valeurs de chaîne.
  • Cordes.
  • Expressions régulières.
  • Fichier IO.

Vous pouvez peut-être trouver quelque chose de similaire pour les bases de données et les services Web.

N'oubliez pas que les langues situées au-dessus du CLR ont des propriétés très différentes. Par exemple, inline dans le langage F # vous permet d'automatiser des optimisations qui peuvent donner d'énormes gains de performances par rapport à C #. Inversement, goto en C # vous permet de faire certaines choses plus efficacement que ce qui est possible en F # et les optimisations sur les structures étaient plus efficaces en C # qu'en F # (la dernière fois que j'ai regardé).

Existe-t-il des repères complets et respectés?

Non, mais il y a beaucoup de repères dispersés qui se concentrent sur les valeurs aberrantes car ils sont plus intéressants. Par exemple, cet article de blog décrit pourquoi un benchmark de table de hachage générique simple peut être 17 × plus rapide en F # sur .NET qu'en Java sur la JVM. Dans ce cas la raison en était que les types de valeur et les génériques réifiés permettent d'écrire une implémentation de table de hachage générique beaucoup plus efficace sur .NET que sur la JVM.

2
Jon Harrop

Benchmarks ... Vous pouvez prouver presque tout avec un test adapté à vos besoins.
Sauf Chuck Norris. Chuck Norris est plus lent et plus rapide que X s'il le souhaite.

Un autre point. Disons que vous arrivez à la conclusion que Java est plus rapide. Cela impliquerait-il que dans 2 ans, ce sera toujours plus rapide?

Si Java est 5% plus rapide et .NET est 10% plus facile à travailler avec quoi choisiriez-vous?
Il existe de nombreux facteurs et les performances ne sont que l'un d'entre eux. Et si les différences sont petites (je pense qu'elles le sont), ce n'est probablement pas la plus importante.

Sauf si vous construisez quelque chose qui est très critique pour les performances.

1
Petar Repac

Oui, il y a le jeu de référence, il est assez complet et vous permet de comparer de nombreuses choses différentes.

http://shootout.alioth.debian.org/

La seule chose est qu'il utilise mono au lieu de Visual Studio, mais la différence de performance entre les deux est maintenant très faible.

en général Java est généralement légèrement plus rapide (selon ce que vous faites) mais utilise une empreinte mémoire beaucoup plus grande et ils ont tous les deux la même taille de source.

1
user133018

Pour info, vous n'êtes spécifiquement pas autorisé à utiliser le code du framework .NET pour toute forme d'analyse comparative sans contacter Microsoft au préalable et obtenir son approbation.

Si vous vouliez publier quelque chose, je pensais que je vous le ferais savoir.

De mémoire, MS a créé une librairie, une animalerie qui Java a d'abord montré comment son logiciel pouvait fonctionner plus efficacement dans la même tâche. J'essaie d'y penser.

. NET Pet Store

1
Spence

Je me suis également demandé ce qui donnerait de meilleures performances. Mais je n'ai aucune idée de la façon dont je pourrais procéder pour effectuer un test de référence pour cela.

Donc bonne question - j'espère que nous aurons tous des conseils ici.

Je suppose que ce test de référence devrait être une approche de test de référence "à prix réduit" (facile à configurer et à exécuter par 1 développeur)?

Si quelqu'un a ce genre d'informations, ce serait génial. On me demande souvent d'évaluer moi-même les technologies dans des délais très courts.

Nice one bunn_online!

1
Forer