Comment beaucoup plus rapide est le C++ que le C#?
Ou est-il maintenant dans l'autre sens?
De ce que j'ai entendu qu'il y a certains domaines dans lesquels des C# s'avère être plus rapide que le C++, mais je n'ai jamais eu le courage de le tester par moi-même.
Pensé que l'un de vous pourrait expliquer ces différences dans le détail ou de m'indiquer le bon endroit pour des informations sur cette.
- Protégées, afin d'éviter tout plus aléatoire repères d'être publiés. Si vous pensez que vous pouvez faire de votre cas, vous aurez besoin de 10 rep à le faire.
- Comment cela est-il pas fermé comme avis/argumentatif de toute façon? Ne suis-je pas encore sur StackOverflow? (Ne suggère pas la fermer, juste curieux. J'aime les questions qui incitent à la opiniâtre arguments)
- C'est presque une plaidoirie en question, étant donné que nous vivons dans un âge où IL peut être converti au RPC et optimisé à partir de là: docs.unity3d.com/Manual/IL2CPP.html
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de stricte raison pour laquelle un code binaire en fonction des langages comme le C# ou Java, qui a une équipe commune d'enquête ne peut pas être aussi rapide que du code C++. Cependant, C++ code utilisé pour être beaucoup plus rapide pour une longue période de temps, et aussi, aujourd'hui encore, dans beaucoup de cas. Ceci est principalement dû à la plus avancée optimisations JIT être compliqué à mettre en œuvre, et la vraiment cool, n'arrivant tout à l'heure.
C++ est plus rapide, dans de nombreux cas. Mais ce n'est qu'une partie de la réponse. Le cas où C++ est en fait plus rapide, sont hautement optimisé programmes, où les programmeurs experts soigneusement optimisé l'enfer hors du code. Ce n'est pas seulement beaucoup de temps (et donc cher), mais aussi souvent conduit à des erreurs dues à la sur-optimisation.
D'autre part, le code dans des langages interprétés devient plus rapide dans les dernières versions du moteur d'exécution (.NET CLR ou de la machine virtuelle Java), sans que vous fassiez quoi que ce soit. Et il y a des tas d'optimisations compilateurs JIT pouvez faire qui sont tout simplement impossible dans les langues avec des pointeurs. En outre, certains prétendent que la collecte des ordures doit généralement être aussi rapide ou plus rapide que le manuel de gestion de la mémoire, et dans de nombreux cas, il est. Vous pouvez généralement mettre en œuvre et de réaliser tout cela en C++ ou en C, mais il va être beaucoup plus compliqué et source d'erreurs.
Comme Donald Knuth a dit, "l'optimisation prématurée est la racine de tout mal". Si vous savez vraiment pour vous assurer que votre demande sera consistent pour la plupart en très critique pour les performances de l'arithmétique, et qu'il sera le goulot d'étranglement, et il va certainement être plus rapide en C++, et vous êtes sûr que C++ n'entre pas en conflit avec d'autres exigences, optez pour C++. Dans les autres cas, se concentrer sur la première mise en œuvre de votre demande correctement dans la langue dans laquelle vous convient le mieux, puis de trouver les goulots d'étranglement des performances si elle est trop lente, et ensuite réfléchir à comment optimiser le code. Dans le pire des cas, vous pourriez avoir besoin de faire appel à du code C par l'intermédiaire d'un étranger interface de la fonction, de sorte que vous aurez toujours la possibilité d'écrire des critiques de pièces dans le langage de plus bas niveau.
Garder à l'esprit qu'il est relativement facile d'optimiser un programme correct, mais beaucoup plus difficile à corriger un programme optimisé.
Donnant les pourcentages réels de vitesse avantages est impossible, il dépend en grande partie de votre code. Dans de nombreux cas, le langage de programmation de la mise en œuvre n'est même pas le goulot d'étranglement. Prendre des repères au http://benchmarksgame.alioth.debian.org/ avec beaucoup de scepticisme, comme ces en grande partie test arithmétique code, ce qui est le plus susceptible de ne pas similaire à votre code.
C# ne peut pas être plus rapide, mais il VOUS fait/ME plus rapide. C'est la mesure la plus importante pour ce que je fais. 🙂
Il est cinq oranges plus rapide. Ou plutôt: on ne peut pas (correctement) couverture de réponse. C++ est un langage compilé statiquement (mais alors, il y a le profil de l'optimisation orientée, trop), C# exécute aidé par un compilateur JIT. Il y a tellement de différences que des questions comme “comment beaucoup plus rapide” n'ont pas de réponse, pas même en donnant des ordres de grandeur.
Je vais commencer par en désaccord avec une partie de la accepté (et de bien-upvoted), la réponse à cette question en déclarant:
Il y a effectivement beaucoup de raisons pourquoi JITted code fonctionne plus lentement que d'un C++ optimisé (ou une autre langue sans gestion d'exécution)
programme y compris:
cycles de calcul de passé sur JITting code au moment de l'exécution, par définition, pas disponible pour une utilisation dans l'exécution du programme.
tout chaud chemins de la Gigue sera en concurrence avec votre code pour l'enseignement et le cache de données dans la CPU. Nous savons que cache domine quand il s'agit de la performance et natif de langages tels que le C++ n'ont pas ce type de conflit, par définition.
au moment de l'exécution de l'optimiseur de budget-temps est nécessairement beaucoup plus limitée que celle d'un moment de la compilation de l'optimiseur (comme un autre intervenant a souligné
Bas de ligne: en fin de compte, vous sera presque certainement être en mesure de créer une mise en œuvre plus rapide en C++ que vous pourriez en C#.
Maintenant, avec cela dit, comment beaucoup plus rapide n'est pas vraiment quantifiable, comme il y a trop de variables: la tâche, domaine de problème, le matériel, la qualité de mises en œuvre, et de nombreux autres facteurs. Vous devrez exécuter des tests sur votre scénario afin de déterminer la différence de performance, et ensuite décider s'il vaut la peine l'effort supplémentaire et de la complexité.
C'est un très long et complexe sujet, mais je pense qu'il vaut la peine de mentionner, par souci d'exhaustivité que de C#runtime optimizer est excellente, et est capable d'effectuer certaines optimisations dynamiques à l'exécution qui sont tout simplement pas disponibles pour C++ avec le moment de la compilation (statique) de l'optimiseur. Même avec cela, l'avantage est toujours que profondément dans l'application native de la cour, mais la dynamique de l'optimiseur est la raison pour laquelle le "presque certainement" qualificatif donné ci-dessus.
--
En termes de performance relative, j'ai été troublé par les chiffres et les discussions que j'ai vu dans certains autres réponses, j'ai donc pensé carillon et dans le même temps, offrir un peu de soutien pour les déclarations que j'ai faites ci-dessus.
Une énorme partie du problème avec ces critères est que vous ne pouvez pas écrire du code C++ comme si vous avez été écrit en C# et s'attendre à obtenir des résultats représentatifs (par exemple. l'exécution des milliers d'allocations de mémoire en C++ va vous donner de terribles chiffres.)
Au lieu de cela, j'ai écrit un peu plus idiomatique de code C++ et comparé le code C# @Wiory fourni. Les deux principaux changements que j'ai faits pour le code C++ ont été:
1) vector::reserve()
2) aplati le tableau 2d de 1d pour atteindre la meilleure localité de cache (bloc contigu)
C# (.NET 4.6.1)
Moment de l'exécution (Libération): Init: 124ms, Remplissage: 165ms
C++14 (Clang v3.8/C2)
Moment de l'exécution (Libération): Init: 398µs (oui, c'est microsecondes), le Remplir: 152ms
Total des temps d'Exécution: C#: 289ms, C++ 152ms (environ 90% plus rapide)
Observations
Changer le C# de mise en œuvre de la même 1d de la matrice de mise en œuvre
donné Init: 40ms, Remplissage: 171ms, Total: 211ms (C++ était encore presque
40% plus rapide).
Il est beaucoup plus difficile à concevoir et à écrire "rapide" code en C++ que d'écrire une "régulière" code de langue.
C'est (peut-être) étonnamment facile d'obtenir des performances médiocres en C++, nous avons vu que, avec sans réserve des vecteurs de la performance. Et il y a beaucoup de pièges de ce genre.
C#'s la performance est plutôt étonnant quand on considère tout ce qui se passe au moment de l'exécution. Et que le rendement est relativement facile à
d'accès.
Plus anecdotiques en comparaison des données de la performance de C++ et C#: https://benchmarksgame.alioth.debian.org/u64q/compare.php?lang=gpp&lang2=csharpcore
La ligne de fond est que le C++ vous donne beaucoup plus de contrôle sur la performance. Voulez-vous utiliser un pointeur? Une référence? La pile de la mémoire? Tas? Dynamique polymorphisme ou d'éliminer la gestion d'exécution d'une vtable avec polymorphisme statique (à l'aide de modèles/PFI)? En C++, vous avez pour... euh, obtenir faire tous ces choix (et plus) de vous-même, idéalement de manière à ce que votre solution meilleures adresses le problème auquel vous faites face.
Demandez-vous si vous voulez vraiment ou besoin de contrôle, parce que même pour le trivial exemple ci-dessus, vous pouvez voir que, même si il y a une amélioration significative des performances, il nécessite un approfondissement de l'investissement à l'accès.
int[,]
... suite par exemple.double[,]
qui est plus proche de ce qui est utilisé dans l'indice de référence. Il n'est pas encore parfait comparaison, car à peu près tout dans le C# est un objet qui est initialisé dans la mémoire (et il est au-dessus de là). Résultats: l'initialisation a pris 3 ms et exécution a eu 95 ms. J'ai donc pu déclarer que le C# est 40% plus RAPIDE que le C++. Ce qui n'est évidemment pas vrai. Peut-être que ma machine est plus rapide que @U007D. Peut-être que j'ai oublier de mettre en mode Release (puis mon code >300ms à exécuter). Conclusion: la vitesse de code compilé est égal. La façon dont vous avez écrit le code est plus grand facteur.Dans mon expérience (et j'ai beaucoup travaillé avec les deux langues), le principal problème avec C# par rapport à C++ est forte consommation de la mémoire, et je n'ai pas trouvé un bon moyen de le contrôler. C'était la consommation de mémoire qui serait éventuellement ralentir .NET logiciel.
Un autre facteur est que le compilateur JIT ne peut pas se permettre trop de temps à faire des optimisations avancées, parce qu'il fonctionne au moment de l'exécution, et l'utilisateur final serait-il un avis si ça prend trop de temps. D'autre part, un compilateur C++ dispose de tous les temps il a besoin pour faire des optimisations au moment de la compilation. Ce facteur est beaucoup moins important que la consommation de mémoire, à mon humble avis.
Dispose
. Oublier de déposer immédiatement un fichier ouvert en mode exclusif pourrait être un problème majeur, il peut bloquer l'ouverture d'ailleurs pour un temps déraisonnable. Vous pourriez accidentellement laisser les verrous de fichier tenue. Les fuites sont encore possible avec un garbage collector, si vous avez accidentellement garder des références accessibles inutilement.Un scénario particulier où C++ a toujours la haute main (et, pour les années à venir) se produit lorsque polymorphes décisions peuvent être déterminées à l'avance au moment de la compilation.
Généralement, l'encapsulation et différés la prise de décision est une bonne chose, car cela rend le code plus dynamique, plus facile de s'adapter à l'évolution des besoins et plus facile à utiliser comme un cadre. C'est pourquoi la programmation orientée objet en C# est très productive et il peut être généralisée sous le terme de “généralisation”. Malheureusement, ce genre de généralisation vient à un coût au moment de l'exécution.
Généralement, ce coût est non-substantiel, mais il y a des applications où la surcharge de méthode virtuelle des appels et de la création d'un objet peut faire une différence (surtout depuis que les méthodes virtuelles d'empêcher d'autres optimisations telles que l'appel de la méthode inline). C'est là que le C++ a un énorme avantage, car vous pouvez utiliser des modèles pour atteindre à une sorte de généralisation qui a pas impact sur runtime mais il n'est pas forcément moins polymorphes que la programmation orientée objet. En fait, tous les mécanismes qui constituent la programmation orientée objet peut être modélisé à l'aide seulement du modèle de techniques et de compilation de résolution.
Dans de tels cas (et, certes, ils sont souvent restreintes à des problèmes spéciaux domaines), C++ gagne contre C# et comparables langues.
IComparer
l'intérieur de la boucle d'un algorithme de tri. C++ peut le faire.IComparer
types. C'est tout le problème ici, et qui est résolu par le C++’ au moment de la compilation des génériques (= modèles).sort(arr, generic_comparer)
sera aussi efficace qu'un écrit à la main boucle en C++. Il ne sera jamais en C#.Sort
méthode qui accepte uncomparator
argument. En C++, cecomparator
peut être incorporé même lorsqueSort
ne sera pas. Dans les langues que vous avez énumérés, c'est fondamentalement pas possible, et ce est la conception de restriction, pas une technique qui pourrait disparaître dans l'avenir.Sort
était une non-méthode générique dans mon esprit. Vous avez raison, il a correctement un type distinct dans .NET si c'est un générique (pas sûr de Java, qui n'a pas réifiée génériques après tout ... mais peut-être le moteur d'exécution assure le suivi de ces données, de toute façon). Oui, vous avez raison.C++ (ou C pour que ce soit), vous donne un contrôle précis sur vos structures de données. Si vous voulez bits-twiddle vous avez la possibilité de. Grand géré Java ou .NET applications (OWB, Visual Studio; 2005) qui utilisent les structures de données internes de l'Java/.NET bibliothèques de porter les bagages avec eux. J'ai vu OWB concepteur de sessions à l'aide de plus de 400 MO de RAM et d'OFFRES pour cube ou ETL conception d'entrer dans le 100 de MO ainsi.
Sur une base prévisible de la charge de travail (comme la plupart des benchmarks que répéter le processus plusieurs fois) une équipe commune d'enquête peut vous obtenir le code est optimisé assez bien qu'il n'y a pas de différence pratique.
De l'OMI sur les grandes applications de la différence n'est pas tellement le JIT que les structures de données que le code lui-même est à l'aide. Lorsqu'une demande est de la mémoire-lourds, vous obtiendrez moins efficace de l'utilisation du cache. Le Cache sur les Processeurs modernes sont assez chers. Où C ou C++ vraiment gagner est là que vous pouvez optimiser votre utilisation de structures de données de jouer gentiment avec le cache du PROCESSEUR.
Pour les graphiques de la norme C# de la classe Graphics est beaucoup plus lent que GDI accessible via C/C++.
Je sais que cela n'a rien à voir avec la langue en soi, plus de au total .NET plate-forme, mais la carte Graphique est ce qui est offert pour le développeur comme un RIB de remplacement, et sa performance est si mauvais que je n'aurais même pas oser faire des graphiques avec elle.
Nous avons un simple test permet de voir à quelle vitesse une bibliothèque graphique est, et c'est tout simplement le dessin lignes au hasard dans une fenêtre. C++/GDI est encore accrocheur avec 10000 lignes, tandis que le C#/Graphique a de la difficulté à faire 1000 en temps réel.
De la collecte des déchets est la raison principale de Java# NE peut pas être utilisé pour les systèmes en temps réel.
Quand le GC se produire?
Combien de temps ça va prendre?
C'est non-déterministe.
Nous avons eu à déterminer si C# est comparable à C++ dans la performance et j'ai écrit quelques programmes de test pour que (à l'aide de Visual Studio 2005 pour les deux langues). Il s'est avéré que sans la collecte des ordures et de ne tenir compte que de la langue (pas de cadre) C# a pratiquement les mêmes performances que le C++. L'allocation de mémoire est plus rapide en C# qu'en C++ et C# dispose d'un léger avantage dans le déterminisme lorsque des données sont les tailles accrue au delà de la ligne de cache limites. Cependant, tout cela avait fini par être payé et il y a un énorme coût sous la forme de non-déterministe de la performance des hits pour C# grâce à la collecte des déchets.
Comme d'habitude, il dépend de l'application. Il y a des cas où C# est probablement très lent, et d'autres cas où C++ est de 5 ou 10 fois plus rapide, en particulier dans les cas où les opérations peuvent être facilement SIMD avais.
Je sais que ce n'est pas ce que vous demandez, mais C# est souvent plus rapide de écrire que C++, qui est un gros bonus dans un cadre commercial.
C/C++ peut réaliser infiniment mieux dans les programmes où il y a soit des tableaux grand ou lourd boucle/itération sur des tableaux (de toute taille). C'est la raison pour que les graphiques sont généralement beaucoup plus rapide en C/C++, en raison de lourdes opérations de matrice sous-tendent presque toutes les opérations graphiques. .NET est notoirement lent dans la gamme des opérations d'indexation en raison de tous les contrôles de sécurité, et cela est particulièrement vrai pour les matrices multi-dimensionnelles (et, oui, de forme rectangulaire, C# les tableaux sont encore plus lente que irréguliers C# tableaux).
Les bonus de C/C++ sont les plus prononcés, si vous vous en tenez directement avec les pointeurs et éviter de Boost,
std::vector
haut niveau et d'autres récipients, ainsi que lesinline
chaque petite fonction possible. L'utilisation de la vieille école des tableaux chaque fois que possible. Oui, vous aurez besoin de plus de lignes de code pour faire la même chose que vous avez fait en Java ou en C# comme vous d'éviter de haut niveau des conteneurs. Si vous avez besoin d'dynamiquement un tableau de taille, vous aurez juste besoin de se rappeler de la paire de votrenew T[]
avec un correspondantdelete[]
instruction (ou utiliserstd::unique_ptr
)—le prix de la vitesse supplémentaire est que vous devez vous code avec plus de soin. Mais, en échange, vous arrivez à vous débarrasser de la charge de la gestion de la mémoire /garbage collector, qui peut facilement être de 20% ou plus de la durée d'exécution de fortement orienté objet en Java et en .NET, ainsi que ceux massive de la mémoire gérée par le tableau d'indexation des coûts. C++ applications peuvent également bénéficier de quelques chouettes commutateurs de compilateur, dans certains cas spécifiques.Je suis un expert programmeur en C, C++, Java et C#. J'ai récemment eu l'occasion rare de mettre en œuvre exactement la même algorithmique du programme dans le dernier 3 langues. Le programme a beaucoup de maths et un tableau multi-dimensionnel des opérations. J'ai fortement optimisé ce dans les 3 langues. Les résultats sont typiques de ce que j'ai l'habitude de voir au moins des comparaisons rigoureuses: Java était d'environ 1,3 x plus rapide que le C# (la plupart des machines virtuelles sont plus optimisé que le CLR), et le C++ pointeur brut version est venu dans environ 2,1 x plus rapide que le C#. Notez que le programme C# uniquement utilisé coffre-fort à code—il est de mon avis que vous pourriez aussi bien le code en C++ avant d'utiliser le
unsafe
mot-clé.De peur qu'on pense que j'ai quelque chose contre C#, je termine en disant que C# est probablement mon préféré de la langue. C'est le plus logique, intuitive et rapide développement de la langue que j'ai rencontré jusqu'à présent. Je fais tout mon prototypage en C#. Le langage C# a beaucoup de petits, subtil avantages par rapport à Java (oui, je sais que Microsoft a eu la chance de résoudre un bon nombre de Java lacunes en entrant dans le jeu fin et sans doute la copie de Java). Toast à la Java
Calendar
classe de n'importe qui? Si Microsoft jamais passe réel effort pour optimiser le CLR et le .NET Gigue, C# pourrait sérieusement prendre le dessus. Je suis honnêtement surpris qu'ils n'ont pas déjà fait, ils n'ont donc beaucoup de choses dans le langage C#, pourquoi ne pas poursuivre avec l'percutant les optimisations du compilateur? Peut-être que si nous avons tous beg.new T[]
avec un correspondantdelete[]
" – Non, vous ne le font pas. Il y astd::unique_ptr
le faire pour vous.> à Partir de ce que j'ai entendu ...
Votre difficulté semble être de décider si ce que vous avez entendu n'est crédible, et que la difficulté va juste être répétée lorsque vous essayez d'évaluer les réponses sur ce site.
Comment allez-vous décider si les choses que disent les gens ici sont plus ou moins crédible que ce que vous avez entendu à l'origine?
Un autre moyen serait de demander preuve.
Lorsque quelqu'un prétend que "il y a certains domaines dans lesquels des C# s'avère être plus rapide que le C++" leur demander pourquoi ils disent que, demandez-leur de vous montrer mesures, demandez-leur de vous montrer des programmes. Parfois, ils n'ont tout simplement fait une erreur. Parfois, vous verrez qu'ils sont tout simplement exprimer une opinion plutôt que de partager quelque chose qu'ils peuvent montrer pour être vrai.
Souvent de l'information et de l'opinion sera mélangé jusqu'à ce qu'on dit, et vous aurez à les essayer et de trier ce qui est qui. Par exemple, les réponses dans ce forum:
"Prendre les repères au http://shootout.alioth.debian.org/
avec beaucoup de scepticisme, comme l'
ces largement test arithmétique code,
qui est le plus susceptible de ne pas similaire à
votre code à tout."
Demandez-vous si vous avez vraiment
comprendre ce "ces en grande partie test
l'arithmétique code" moyens, et puis
demandez-vous si l'auteur a
effectivement montré que sa demande est
vrai.
"C'est plutôt inutile de test, car cela dépend vraiment de la façon dont bien
les différents programmes ont été
optimisé; j'ai réussi à accélérer
certains d'entre eux par 4 à 6 fois ou plus,
rendre clair que la comparaison
entre unoptimized programmes
plutôt ridicule."
Demandez-vous si l'auteur a
en fait de vous montrer qu'il a réussi
pour "accélérer certains d'entre eux par 4-6
fois ou plus" - c'est une simple demande de faire!
.NET les langues peuvent être aussi rapide que du code C++, ou encore plus rapide, mais le code C++ ont une plus constant débit que l' .NET a la pause de GC, même si c'est très habile de ses pauses.
Donc si vous avez un peu de code qui a constamment courir vite sans aucune pause .NET va introduire une latence à un certain point, même si vous êtes très prudent avec le runtime GC.
Pour "embarassingly parallèles" problèmes lors de l'utilisation de Intel TBB et OpenMP sur le C++, j'ai observé un peu près 10x augmentation des performances similaires (pures mathématiques), des problèmes de fait avec C# et TPL. SIMD est un domaine où le C# ne peut pas rivaliser, mais j'ai aussi eu l'impression que TPL a une importante surcharge.
Cela dit, je ne l'utilise C++ pour la performance de tâches critiques où je sais que je vais être en mesure de multithread et d'obtenir des résultats rapidement. Pour tout le reste, C# (et, occasionnellement, F#) est tout simplement parfait.
C'est extrêmement vague question sans réelle réponse définitive.
Par exemple; je préfère jouer en 3D-jeux qui sont créés en C++ qu'en C#, parce que la performance est certainement beaucoup mieux. (Et je sais de XNA, etc., mais il s'agit pas de façon à proximité de la chose réelle).
D'autre part, comme mentionné précédemment, vous devez développer dans un langage qui permet de faire ce que vous voulez rapidement, et ensuite, si nécessaire optimiser.
En théorie, pour de longues de type serveur d'application, un JIT-langage compilé peut devenir beaucoup plus rapide qu'un nativement compilée en contrepartie. Depuis le JIT langage compilé est généralement la première compilation d'un assez faible niveau intermédiaire de la langue, vous pouvez faire beaucoup de haut niveau optimisations droit au moment de la compilation de toute façon. Le gros avantage vient que l'équipe peut continuer à recompiler les sections de code à la volée comme il devient de plus en plus de données sur la façon dont l'application est utilisée. Il peut organiser le code plus courantes des chemins d'accès à permettre à la branche de prédiction pour réussir aussi souvent que possible. Il peut ré-arranger les blocs de code distincts qui sont souvent appelées ensemble pour garder à la fois dans le cache. Il peut passer plus d'efforts à l'optimisation des boucles internes.
Je doute que cela soit fait par .NET ou de la Jre, mais il a été l'objet de recherches en arrière quand j'étais à l'université, il n'est donc pas déraisonnable de penser que ce genre de choses peuvent trouver leur chemin dans le monde réel à un certain point bientôt.
Les Applications qui requièrent beaucoup d'accès à la mémoire par exemple. manipulation de l'image sont généralement mieux écrit en environnement non géré (C++) réussi (C#). Optimisé boucles internes avec le pointeur de l'arithmétique sont beaucoup plus faciles à avoir le contrôle en C++. En C#, vous pourriez avoir besoin de recourir à la contamination de code pour obtenir même près les mêmes performances.
J'ai testé
vector
en C++ et C# équivalent -List
et simple 2d tableaux.Je suis à l'aide de Visual C#/C++ 2010 Express. Les deux projets sont de simples applications de console, je l'ai testé en standard (pas de réglages personnalisés) release et debug mode.
C# listes de courir plus vite sur mon pc, initialisation de tableau est également plus rapide en C#, les opérations mathématiques sont plus lents.
Je suis en utilisant Intel Core2Duo [email protected], C#.NET 4.0.
Je sais que le vecteur de la mise en œuvre est différente de celle de C# de la liste, mais je voulais juste tester les collections que je voudrais utiliser pour stocker mes objets (et d'être en mesure d'utiliser l'indice de accesseur).
Bien sûr, vous devez effacer de la mémoire (disons pour chaque utilisation de
new
), mais je voulais garder le code simple.C++ vecteur de test:
C# test:
C++ - tableau:
C# - tableau:
Temps: (Release/Debug)
C++
(Oui, 13 secondes, j'ai toujours des problèmes avec les listes ou les vecteurs en mode de débogage.)
C#:
System.DateTime.Now
, mais plutôt, le Chronomètre de classe.Eh bien, ça dépend. Si le byte-code est traduit en code machine (et pas seulement JIT) (je veux dire, si vous exécutez le programme) et si votre programme utilise plusieurs allocations/deallocations il pourrait être plus rapide car la GC algorithme juste besoin d'un pass (théoriquement) à travers l'ensemble de la mémoire une fois, mais c'est normal malloc/realloc, free C/C++ appelle provoque une surcharge sur chaque appel (appel de la surcharge, de la structure des données de la surcharge, le cache 😉 ).
De sorte qu'il est théoriquement possible (aussi pour d'autres GC langues).
Je ne vois pas vraiment l'extrême désavantage de ne pas être en mesure d'utiliser la métaprogrammation avec C# pour la plupart des applications, parce que la plupart des programmeurs ne pas l'utiliser de toute façon.
Un autre grand avantage est que le SQL, comme le LINQ "extension", offre des possibilités pour le compilateur d'optimiser les appels aux bases de données (en d'autres termes, le compilateur pourrait compiler l'ensemble de LINQ pour un "blob" binaire où les fonctions sont intégrées ou de votre utilisation optimisée, mais je suis spéculer ici).
Je suppose qu'il y a des applications écrites en C# en cours d'exécution rapide, ainsi que il y a plus de C++ écrit les applications en cours d'exécution rapide (bien C++, il suffit de plus... et de prendre UNIX trop...)
- la question en effet est - ce qu'est cette chose, les utilisateurs et les développeurs se plaignent ...
Eh bien, à mon humble avis, dans le cas de C#, nous avons de très confort de l'INTERFACE utilisateur, très agréable hiérarchie des bibliothèques, et de l'ensemble de l'interface et du système de CLI. Dans le cas de C++ nous avons des modèles, ATL, COM, MFC et tout inclus de alreadyc écrit et l'exécution de code comme OpenGL, DirectX et ainsi de suite... les Développeurs se plaint de indeterminably ressuscité GC appels en cas de C# (signifie que le programme s'exécute rapidement, et dans un deuxième - bang! il est coincé).
Pour écrire du code en C# très simple et rapide (ne pas oublier que l'augmentation de risques d'erreurs.
Dans le cas de C++, les développeurs se plaint de fuites de mémoire, - des moyens écrase, les appels entre les Dll, ainsi que de "l'enfer des DLL" - problème avec le soutien et les bibliothèques de remplacement par des nouvelles...
Je pense que plus de compétences que vous avez dans le langage de programmation, plus de qualité (et la vitesse) permettra de caractériser votre logiciel.
Je voudrais le mettre de cette façon: les programmeurs qui écrivent plus vite code, sont ceux qui sont le plus informés de ce qui rend les machines actuelles aller vite, et d'ailleurs ils sont aussi ceux qui utilisent un outil approprié qui permet à pour les précise de bas niveau et déterministe de techniques d'optimisation. Pour ces raisons, ces personnes sont celles qui utilisent le C/C++ plutôt que de C#. J'irais même jusqu'à affirmer cela comme un fait.
> Après tout, les réponses doivent être quelque part, n'est-ce pas? 🙂
Euh, non.
Que plusieurs réponses noté, la question est sous-spécifié d'une façon qui attire les questions en réponse, pas de réponses. Pour ne prendre qu'un moyen:
Et puis quels programmes? Quelle machine? Quel système d'exploitation? Quel ensemble de données?
Si je ne me trompe pas, C# modèles sont déterminés au moment de l'exécution. Ce doit être plus lent que le temps de compilation des templates de C++.
Et quand vous prenez tous les autres au moment de la compilation des optimisations mentionné par de nombreux autres, ainsi que le manque de sécurité qui n'a, en effet, signifie plus de vitesse...
Je dirais que C++ est le choix évident en termes de vitesse brute et le minimum de consommation de mémoire. Mais cela signifie aussi plus de temps pour développer le code et de s'assurer que vous ne sont pas de fuite de mémoire ou de causer un pointeur null exceptions.
Verdict:
C#: un développement plus Rapide, plus lent exécuter
C++: développement Lent, plus rapide à exécuter.
Cela dépend vraiment de ce que vous voulez accomplir dans votre code. J'ai entendu dire que c'est juste des trucs de la légende urbaine qu'il n'y a aucune différence de performances entre les VB.NET, C# et C++. Cependant, j'ai trouvé, au moins dans les comparaisons de chaînes, que le C++ bat le pantalon large de C#, qui bat le pantalon large de VB.NET.
J'ai pas fait des comparaisons exhaustives dans la complexité algorithmique entre les langues. Je suis aussi juste en utilisant les paramètres par défaut dans chacune des langues. Dans VB.NET je suis en utilisant les paramètres d'exiger la déclaration des variables, etc. Voici le code que j'utilise pour le C++: (Comme vous pouvez le voir, ce code est assez simple). Je suis en cours d'exécution de même dans les autres langues dans Visual Studio 2013 avec .NET 4.6.2.
Il existe des différences importantes entre C# et C++ sur l'aspect performance:
D'ailleurs que programmeur compétence joue également un rôle. J'ai vu des mauvais code C++ où les classes où sont passées par valeur comme argument dans tous les sens. Vous pouvez réellement faire de pire en C++ si vous ne payez pas attention.
Inspiré par la présente, j'ai fait un test rapide avec 60 pour cent de la commune instruction nécessaire dans la plupart des programmes.
Voici le code C#:
Chaîne de tableau et de liste de tableaux sont utilisé à dessein, afin d'inclure ces instructions.
Voici le code c++:
La taille du fichier d'entrée que j'ai utilisé était de 40 KO.
Et voici le résultat -
Oh, mais ce qui était sur Linux... Avec C# en cours d'exécution sur Mono... Et C++ avec g++.
OK, c'est ce que je suis sur Windows – Visual Studio; 2003: