La Performance de Managed C++ Vs non géré/C++natif
Je suis en train d'écrire une très haute performance de l'application qui gère et les processus des centaines d'événements à chaque milliseconde.
Est le C++ plus rapide que le c++? et pourquoi?
Managed C++ traite CLR au lieu de l'OS et de la CLR prend en charge la gestion de la mémoire, ce qui simplifie le code et est probablement plus efficace que le code écrit par un "programmeur" dans le C++? ou il y a une autre raison?
Lors de l'utilisation géré, comment peut-on alors éviter d'allocation dynamique de la mémoire, ce qui provoque une dégradation des performances, si c'est transparent pour le programmeur et géré par le CLR?
Afin de revenir à ma question, Est-managed C++ plus efficace en termes de vitesse que le C++ et pourquoi?
Le C++ est le prédécesseur de C++/CLI.
vrai, mais beaucoup de ceux qui viennent, plus récemment, C++/CLI appeler le C++ car il a une syntaxe C++ et produit du code managé. Ils ne savent pas que c'est le nom de quelque chose d'autre. Avis de la question, dit le C++ n'est pas Géré de C++.
OriginalL'auteur bsobaid | 2010-06-10
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de réponse unique à cette question. Comme vraiment général règle, le code natif sera généralement plus rapide, mais 1) ce n'est pas toujours le cas, 2) parfois, la différence est trop petite pour se soucier, et 3) la façon dont le code est écrit, habituellement, font plus de différence que tablespaces gérés gérés.
Géré le code est exécuté dans une machine virtuelle. Fondamentalement, vous commencez avec un compilateur qui produit des octets de codes de sortie, puis l'alimentation que pour la machine virtuelle. La machine virtuelle puis re-compile en code machine et l'exécute. Cela peut fournir des avantages réels dans certaines circonstances. Pour un exemple, si vous avez un processeur 64 bits 64 bits VM (assez près d'un plus) mais et ancien programme écrit avant les processeurs 64 bits sont communs, la VM sera toujours compilé que de byte code pour 64-bits en code machine, ce qui peut donner un substantiel avantage de vitesse pour au moins une partie du code.
Dans le même temps, il peut aussi être une assez notable inconvénient pour certains code. En particulier, le compilateur est en cours d'exécution, tandis que l'utilisateur attend. Pour accueillir que la VM compilateur ne peut pas lui-même l'exécuter très lentement. Bien que natif des générateurs de code différents, il ya une assez bonne chance que tout ce compilateur natif vous choisissez comprend au moins quelques optimisations qui ont été perdus dans la VM compilateur de bytecode pour garder son utilisation des ressources raisonnables.
La machine virtuelle utilise également un garbage collector. Les éboueurs ont plutôt des caractéristiques différentes de gestion manuelle de la mémoire. Avec beaucoup de manuel de gestionnaires, de l'allocation de mémoire est assez cher. La libération de la mémoire est assez bon marché, mais à peu près linéaire sur le nombre d'articles de presse. Autres manuel gestionnaires à peu près inverse, ce travail supplémentaire lors de la libération de la mémoire afin de faire de la répartition de plus en plus vite. De toute façon, la structure des coûts est différente à partir d'un type de collecteur.
Avec un garbage collector, de l'allocation de mémoire est généralement très à bas prix. Avec un type (copie) du collecteur, le coût de la libération de la mémoire dépend principalement du nombre d'objets qui leur ont été attribués et sont encore (au moins potentiellement) en cours d'utilisation.
Les allocations elles-mêmes diffèrent également. En C++ natif, en général, vous créez la plupart des objets sur la pile, où à la fois l'allocation de et la libération de la mémoire est extrêmement bon marché. Dans le code managé, vous allouer un pourcentage bien plus important de la mémoire dynamiquement, où il est de ces ordures.
il n'y a pas CLR VM de la traduction.
La traduction en code machine lieu qu'une seule fois. Si je suis l'exécution de la même ligne de code à de nombreuses reprises alors je pense que cette traduction n'a pas d'importance. Oui le garbage collector point vous faites est important et également l'allocation dynamique de la mémoire. Est-il un exemple de la disposition où vous préallouer une grande partie de la mémoire à utiliser pour éviter dynamique malloc? EST-il possible de le faire en C#?
Cercueil en Vous décrivant le comportement de la Java Hotspot VM. D'abord (rapide) compile sur la première demande, que détecte chaud boucles (d'où son nom) et recompile avec certains, pas trop mal d'optimisations. Malheureusement, l' .NET CLR (4) n'est pas encore le faire.
oui, on pourrait mettre un grand chunck de la mémoire pour éviter de malloc, en utilisant de grandes variables globales, cependant la fonction locale pour les petites variables de travail généralement plus rapide. Bien que les situations extrêmes exigent des solutions extrêmes Et vous avez besoin de tester ceux-ci. c'est dur à dire, sauf si vous avez testé
OriginalL'auteur Jerry Coffin
Vous pouvez écrire lente code dans n'importe quelle langue; à l'inverse, vous pouvez utiliser décent algorithmes qui pourrait bien être le plus rapide est de presque n'importe quelle langue.
La commune de la réponse ici serait de choisir une langue que vous connaissez déjà, utiliser des algorithmes appropriés, puis de profil, le diable hors de lui pour déterminer les points chauds.
Je suis un peu préoccupé par la des centaines d'événements à chaque milliseconde déclaration. C'est beaucoup trop. Êtes-vous raisonnablement va être capable de faire le traitement que vous attendez dans tout langue?
En tant que développeur C++ sur les systèmes à haute performance, j'ai tendance à faire confiance à ma capacité de profil et d'optimiser le code émis. Cela dit, il existe de très haute performance .NET applications, où l'écrivain a fait de grands efforts pour ne pas faire d'allocation dynamique de la mémoire à l'intérieur de la critique boucles principalement à l'aide allouée piscines d'objets créés à l'avance.
Donc, pour reprendre mon commentaire précédent: choisissez ce que vous connaissez déjà, puis de tune. Même si vous frappez une impasse; vous le savez probablement beaucoup plus au sujet de votre problème de l'espace.
C++ - avoir un regard sur boost::groupe C# - je ne suis pas familier, mais de comprendre qu'il peut/qui a été fait
merci, c'était utile de plomb. la piscine a elle. Boos n'est pas réputée pour sa vitesse. L'utilisez-vous pour vos applications hautes performances? Je suis principalement un développeur C#, mais maintenant, je suis pas à pas dans C++ monde. Ses un must pour HFT développeurs.
Dans le pire des cas vous pouvez toujours mettre en œuvre vos pools de mémoire allocateurs, afin de ne pas dépendre d'aucune bibliothèque. Évidemment, cette approche a ses inconvénients ..
OriginalL'auteur sdg
Tout dépend de la situation.
Choses qui rendent le code non managé plus rapide /code managé plus lent:
Choses qui rendent le code managé plus rapide /code non managé plus lent:
Et probablement il ya beaucoup plus de raisons.
Dépend souvent d'exécuter le même code (une seule fois, ou des millions de fois). Dans la pratique, il ne sera probablement pas d'importance.
Code non managé peut être faite processeur spécifique par une ramification bottlnecks en fonction de l'exécution de la détection du processeur. Le compilateur intel C++ peut automatiquement faire, par exemple, mais seulement pour les types spécifiques d'enseignement et d' (controversée) uniquement pour les Processeurs intel.
OriginalL'auteur Patrick
Code managé est dans la plupart des cas plus lent que le code non managé, même si l' .Net CLR toujours un JIT-compilation avant d'exécuter le code (il n'est pas compilé plusieurs fois que le programme est en cours d'exécution, mais bien de ne jamais interpréter le code).
Le problème, c'est plutôt avec de nombreux contrôles de la CLR, par exemple, pour voir si vous exécutez sur les limites d'un tableau à chaque fois que vous essayez d'y accéder. Ce qui conduit à moins de problèmes de dépassements de la mémoire tampon, etc. mais c'est aussi un gain de performance en raison de la charge supplémentaire de ces contrôles.
J'ai vu des expériences où C# surperformé C++, mais ceux qui ont été menées avec le code fortement de prendre avantage de hiérarchies d'objets, etc. Quand il descend à de nombreux calculs et vous souhaitez obtenir le meilleur parti de votre PC, vous devez aller avec le code non managé.
Un autre point a été déjà mentionnée - le GC mène à quelque peu imprévisible de pauses dans les programmes d'exécution lorsque la mémoire doit être libéré. Vous avez besoin de ce temps ainsi quand on fait de la gestion de la mémoire dans le code non managé, mais il se produit plus souvent et chaque fois que vous décidez de détruire un objet qui signifie que ce n'est pas tout fait à la fois pour l'ensemble du programme, de sorte que vous n'avez pas une longue pause.
OriginalL'auteur Oliver Ulm
Il y a beaucoup de bonnes réponses ici, mais un aspect de code managé qui peut lui donner un avantage sur le long terme est d'analyse de l'exécution. Depuis que le code généré par la gestion de compilateur est un format intermédiaire, le code de l'ordinateur qui exécute peut être optimisé en fonction de l'utilisation réelle. Si un sous-ensemble de la fonctionnalité est très utilisé, le JIT er permet de localiser le code machine tous sur la même page de la mémoire, l'augmentation de la localité. Si un sous-appel à plusieurs reprises à partir d'une méthode particulière, une équipe commune d'enquête er dynamiquement inline.
C'est une amélioration par rapport à du code non managé, où l'in-lining doivent être deviné à l'avance, et l'excès de l'in-lining est nuisible parce qu'il gonfle la taille du code et les causes de la localité problèmes à l'origine (très cher) L2/L1 cache. Cette information est tout simplement pas disponible pour l'analyse statique, de sorte qu'il n'est possible que dans un JIT avec l'environnement. Il y a un goody panier de possible victoires d'analyse de l'exécution comme optimisé boucle de déroulement, etc.
Je ne dis pas le .NET JIT er est aussi intelligente qu'elle pourrait l'être, mais je sais que j'ai entendu sur les caractéristiques de l'analyse et je sais que beaucoup de recherche en analyse de l'exécution a été fait à Hewlett-Packard et d'autres entreprises.
Une mise en œuvre serait de la .NET framework pour commencer l'exécution d'un assembly géré par l'interprétation de la CLR octets de codes et de fréquence de la note d'exécution des opcodes, une forte corrélation entre l'exécution d'une routine et de l'exécution d'un sous-programme à partir de cette routine, etc, puis de générer le code machine, en prenant avantage de la connaissance afin de minimiser les frais généraux (pile d'appel de la construction/destruction de l'incrémentation de la variable de boucle et de sauts, fragmenté "à chaud" des régions de la mémoire, etc.) dans les plus fréquemment exécutées les opérations.
ce serait une très bonne manière de régler le code, mais très difficile à faire pour moi...comme en notant exec freq d'opcodes etc
Pour être juste, si vous êtes en utilisant du code natif vous pouvez utiliser PGO dans VC++ (et probablement d'autres outils ont quelque chose comme ça) pour faire profilé guidée de l'optimisation de l'application. Vous êtes en spéculant cela peut exister pour géré - je sais pour un fait, il existe au moins un natif d'outils.
OriginalL'auteur David Gladfelter
Écrire du code rapide, est toujours une douleur. La question principale que vous pouvez optimiser pour une plate-forme. C'est vraiment un cas sur Console, Incorporé ou autre plate-forme où le Matériel est toujours le même. Dans le vrai monde du PC ce n'est pas le cas. Différente de base, les différents istruction ecc ... réaliser un cauchemar. C'est la question principale, à mon humble avis, c'est vraiment de faire la différence entre l'homme/unam code. L'homme. le code peut être optimiste optimisable pour la nouvelle plate-forme lors de son exécution. Déshumaniser code pas, est écrit dans la pierre.
OriginalL'auteur andreae75
Tout d'abord, votre déclaration "processus des centaines d'événements à chaque milliseconde." semble tout à fait irréaliste. Sauf si vous avez une conception spécifique de l'horloge du module dans l'ordinateur, je ne pense pas que vous pouvez atteindre l'objectif avec un ordinateur générique (résolution typique est d'environ 10 millisecondes). Deuxièmement, Natif C++ est grande mieux en termes de performances. Il ya beaucoup de l'optimisation peut être pris en terme de C++ pour prendre de la vitesse, alors que dans le code managé ils ne sont pas possible. Sachez également que la collecte des ordures dans le code managé rend la performance imprévisible lors de la GC feux de l'ensemble du processus devient gelé. Une fois que vous exécutez dans le problème, la solution est de plus en plus douloureux, maintenant, tout le "beau style" offert par le code managé aura disparu.
Comme pour la capacité de gérer du code pouvez optimiser pour le CPU, il est vrai, mais vous pouvez tirer parti des fonctionnalités du PROCESSEUR (SSE2, MMX, etc.) en C++ natif. D'après mon expérience, le gain de performances est négligeable.
"Il y a beaucoup de l'optimisation peut être pris en terme de C++ pour prendre de la vitesse, alors que dans le code managé ils ne sont pas possible. "- C'est faux. Géré code n'impose pas l'utilisation du garbage collector, il n'utilise par défaut. Les mêmes optimisations qui sont acquis par le manuel d'utilisation de la mémoire sont disponibles pour une utilisation en C#. Vous pouvez déboguer la mémoire, les registres, le traitement des drapeaux, et de manipuler la pile en C# comme vous pouvez avec le C++. Il est possible de même exécuter des premières ASM si vous sauter à travers des cerceaux.
OriginalL'auteur cuteCAT
N'est pas du C++/CLI demi langage interprété comme Java?
Aussi, n'est-ce pas quelqu'un poste une étude que vient de hier qui a montré que les systèmes du GC sont toujours plus lent que les non GC?
OriginalL'auteur Crazy Eddie