119 votes

Performances C ++ vs. Java / C #

Ma compréhension est que le C/C++ génère du code natif pour s'exécuter sur une machine en particulier architecture. A l'inverse, les langues comme Java et C# exécuté sur une machine virtuelle qui ne tient pas à l'écart de l'architecture native. Logiquement, il semble impossible pour Java ou C# pour correspondre à la vitesse de C++ à cause de cette étape intermédiaire, mais je me suis dit que les derniers compilateurs ("hot spot") peut atteindre cette vitesse, ou même le dépasser.

C'est peut-être plus d'un compilateur question que d'une question de la langue, mais quelqu'un peut-il expliquer, dans un anglais simple, comment il est possible pour l'une de ces machine virtuelle langues à faire mieux que la langue maternelle?

178voto

Orion Adrian Points 8855

Généralement, C# et Java peuvent être tout aussi rapide ou plus rapide parce que le compilateur JIT -- d'un compilateur compile votre IL la première fois qu'il est exécuté, peut faire des optimisations que C++ compilé le programme ne peut pas car il peut interroger la machine. Il peut déterminer si la machine est Intel ou AMD; Pentium 4, Core Solo, ou Core Duo; ou si les supports SSE4, etc.

Un programme C++ doit être compilé à l'avance généralement mélangé avec des optimisations pour qu'il fonctionne décemment bien sur toutes les machines, mais n'est pas optimisé autant qu'elle pourrait l'être pour une seule configuration (c'est à dire processeur jeu d'instructions, d'autres matériels).

En outre, certaines des fonctionnalités du langage qui permettent au compilateur C# et Java pour faire des hypothèses à propos de votre code qui permet d'optimiser certaines parties de l'écart qui ne sont pas seulement sans danger pour le compilateur C/C++ pour le faire. Lorsque vous avez accès à des pointeurs, il y a beaucoup d'optimisations qui ne sont pas à l'abri.

Aussi Java et C# peut faire des tas allocations de manière plus efficace qu'en C++ parce que la couche d'abstraction entre le garbage collector et votre code permet de faire tout son tas de compression à la fois (assez cher).

Maintenant, je ne peux pas parler pour Java sur ce point suivant, mais je sais que C# par exemple enlever les méthodes et les appels de méthode quand on sait que le corps de la méthode est vide. Et il va utiliser ce type de logique tout au long de votre code.

Donc, comme vous pouvez le voir, il ya beaucoup de raisons pourquoi certains C# ou Java implémentations sera plus rapide.

Maintenant, ceci dit, les optimisations spécifiques peuvent être réalisés en C++ qui va souffler tout ce que vous pourriez faire avec C#, en particulier dans le graphique ci-domaine et n'importe quand vous êtes proches du matériel. Les pointeurs de faire des merveilles ici.

Donc, en fonction de ce que vous écrivez je voudrais aller avec l'un ou l'autre. Mais si vous écrivez quelque chose qui n'est pas dépendant du matériel (driver, jeu vidéo, etc), je ne voudrais pas vous soucier de la performance de C# (encore une fois ne peut pas parler de Java). Il va faire tout aussi bien.

Un Java côté, @Swati points, un bon article:

http://www-128.ibm.com/developerworks/java/library/j-jtp09275.html?ca=dgr-jw22JavaUrbanLegends

48voto

Jon Norton Points 2048

Chaque fois que je parle géré vs non géré performance, j'aime point à la série Rico (Raymond) n'en comparant C++ et C# versions d'un Chinois/dictionnaire d'anglais. Cette recherche google vous permettra de lire pour vous-même, mais j'aime Rico résumé.

Ainsi suis-je honte de ma défaite? Peine. Le code managé eu une très bon résultat pour pratiquement aucun effort. Pour la défaite la gestion de Raymond:

  • Écrire son propre fichier I/O trucs
  • Écrire son propre classe string
  • Écrire son propre allocateur
  • Écrire sa propre cartographie internationale

Bien sûr, il a utilisé disponible inférieure au niveau des bibliothèques pour ce faire, mais c'est encore beaucoup de travail. Pouvez-vous appeler ce qui est à gauche STL programme? Je n'ai pas pensez donc, je pense qu'il a gardé l' std::vector classe qui, finalement, était jamais un problème et il a continué à le trouver fonction. Pratiquement tout le reste est allé.

Donc, oui, vous pouvez certainement battre le CLR. Raymond peut faire son programme go encore plus rapide je pense.

Fait intéressant, le temps d'analyser la fichier tel que rapporté par les deux programmes temporisateurs internes est sur la même -- 30ms pour chaque. La différence est dans les frais généraux.

Pour moi, la ligne de fond est qu'il a fallu 6 révisions pour les non géré version de battre la gestion de version qui était un simple port de l'original du code non managé. Si vous avez besoin de chaque bit de la performance (et qui ont le temps et l'expertise pour l'obtenir), vous aurez à aller géré, mais pour moi, je vais prendre l'ordre de grandeur avantage que j'ai sur les premières versions de plus de 33% je gagne si j'essaie de 6 fois.

27voto

OldMan Points 523

La compilation pour certaines optimisations du PROCESSEUR sont généralement surestimé. Il suffit de prendre un programme en C++ et compiler avec l'optimisation pour les pentium PRO et exécuter sur un pentium 4. Puis recompiler avec les optimiser pour les pentium 4. J'ai passé de longues après-midis de le faire avec plusieurs programmes. Résultats généraux?? Généralement de moins de 2 à 3% d'augmentation des performances. De sorte que le théorique JIT avantages sont presque nulles. La plupart des différences de performance ne peut être observée lors de l'utilisation de données scalaire de fonctions de traitement, quelque chose qui va finalement avoir besoin de manuel amende de s'écouler pour obtenir le maximum de performance de toute façon. Des optimisations de ce genre sont lents et coûteux à effectuer les rendant parfois inadaptés pour JIT, de toute façon.

Sur le monde réel et le réel de l'application C++ est toujours généralement plus rapide que java, principalement parce que de plus léger en mémoire, qui améliorent les performances du cache.

Mais pour utiliser le C++ capacité de vous, le développeur doit travailler dur. Vous pouvez obtenir de meilleurs résultats, mais vous devez utiliser votre cerveau pour que. C++ est un langage qui a décidé de vous présenter avec plus d'outils, de charge et le prix que vous devez apprendre à être en mesure d'utiliser la langue.

21voto

FlySwat Points 61945

JIT (Just In Time Compiler) peut être très rapide, parce qu'il optimise pour la plate-forme cible.

Cela signifie qu'il peut profiter de n'importe quel compilateur tromper votre CPU peut prendre en charge, indépendamment de ce PROCESSEUR, le développeur a écrit le code.

Le concept de base de l' .NET JIT fonctionne comme ceci (très simplifié):

L'appel d'une méthode pour la première fois:

  • Le code de votre programme appelle une méthode Foo()
  • Le CLR regarde le type qui implémente Foo() et obtient le métadonnées associée
  • À partir des métadonnées, le CLR sait ce que l'adresse mémoire de l'ILLINOIS (Intermédiaire du byte-code) est stocké dans.
  • Le CLR alloue un bloc de mémoire, et appelle le JIT.
  • Le JIT compile le IL en code natif, le place dans la mémoire allouée, puis modifie le pointeur de la fonction Foo()'s le type de métadonnées à point à ce code natif.
  • Le code natif est couru.

L'appel d'une méthode pour la seconde fois:

  • Le code de votre programme appelle une méthode Foo()
  • Le CLR regarde le type qui implémente Foo() et trouve le pointeur de fonction dans les métadonnées.
  • Le code natif à cet emplacement de la mémoire est couru.

Comme vous pouvez le voir, la 2ème fois autour de sa pratiquement le même processus que C++, sauf avec l'avantage du temps réel, des optimisations.

Cela dit, il ya encore d'autres frais généraux de questions que de ralentir un langage managé, mais le JIT aide beaucoup.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X