Je me demande si cela vaut toujours avec les compilateurs modernes et leurs optimisations pour écrire un code critique en C au lieu de C ++ pour la rendre plus rapide. P>
Je sais que C ++ pourrait entraîner une mauvaise performance dans les classes de cas échéant, lorsqu'elles pouvaient être adoptées par référence ou lorsque des classes sont créées automatiquement par le compilateur, généralement avec des opérateurs surchargés et de nombreux autres cas similaires; Mais pour un bon développeur C ++ qui sait éviter tout cela, est-ce que cela vaut toujours la peine d'écrire du code dans C pour améliorer les performances? P>
5 Réponses :
Je vais être d'accord avec beaucoup de commentaires. C Syntaxe est pris en charge, intentionnellement (avec une divergence uniquement en C99), en C ++. Par conséquent, tous les compilateurs C ++ doivent le soutenir. En fait, je pense qu'il est difficile de trouver des compilateurs C dédiés. Par exemple, dans GCC, vous allez réellement utiliser le même moteur d'optimisation / compilation, que le code soit C ou C ++. P>
La vraie question est alors, écrit le code CLARE C et la compilation de C ++ subir une pénalité de performance. La réponse est à toutes fins utiles non. Il y a quelques points difficiles sur les exceptions et les RTTI, mais ceux-ci sont principalement des changements de taille, pas des changements de vitesse. Vous seriez si difficile pressé de trouver un exemple qui prend réellement une performance frappée qu'elle ne semble pas la peine d'écrire un module de dédicat. P>
Qu'est-ce qui a été dit sur les fonctionnalités que vous utilisez est importante. Il est très facile en C ++ de devenir bâclé sur la sémantique de copie et de subir d'énormes frais généraux de la mémoire de copier. Dans mon expérience, c'est le plus gros coût - en C, vous pouvez également subir ce coût, mais pas aussi facilement que je dirais. P>
Les appels de fonction virtuelle sont toujours légèrement plus chers que les fonctions normales. Dans le même temps, les fonctions en ligne forcées sont moins chères que les appels de fonctions normaux. Dans les deux cas, il est probable que le coût des paramètres de poussée / apparaissent de la pile plus coûteux. S'inquiétant de la fonction d'appel de la fonction, bien que devriez venir assez tard dans le processus d'optimisation - car il s'agit rarement d'un problème important. P>
Les exceptions sont coûteuses au moment du temps (au moins GCC). Mais la mise en place de déclarations de capture et l'utilisation de RAII n'a pas de coût significatif associé à celui-ci. C'était par conception dans le compilateur de la GCC (et d'autres) afin que, véritablement, seuls les cas exceptionnels soient coûteux. P>
mais pour résumer: un bon programmeur C ++ serait pas em> pouvoir faire fonctionner son code plus rapidement simplement en l'écrivant en c. p>
Excellente réponse. Et je noterais que C ++ 0X aborde le coût de la copie d'objet dans de nombreux cas en utilisant des références de rvalue.
Oui, nous attendons tous impatiemment la capacité d'écrire des constructeurs à déplacer! Ce sera une excellente aubaine à la performance et à la facilité de codage.
Si vous devez exécuter votre code 1 nanoseconde plus vite ( car il va être utilisé par 1000 personnes, 1000 fois au cours des 1000 prochains jours et que strong> second est très important em> ) quelque chose va. p>
Oui! Ça vaut la peine ... P>
Qu'est-ce que vous ne devez pas oublier est de Mesurer! Strong>. P>
-f code>) li>
Ohhh ... une personne après mon propre cœur. 6 bières froides (ou votre équivalent préféré) quand vous le souhaitez.
@Expategghead: 1 Down; 5 pour aller
Entre les mesures, capture i> ( Stackoverflow.com/questions/406760/... ) La mesure ne vous dit que si ce que vous avez fait une différence. Cela ne vous dit pas quoi corriger. Et cela vous encourage à supposer que les lieux de précision décimaux signifient quelque chose du tout.
pMG cloué. Juste mesurer au lieu d'hypothèses globales. Pensez-y aussi de cette façon, des compilateurs comme GCC séparent le front, le milieu et le dos. Donc, la Fortrane Frontend, C, C ++, ADA, etc. finit dans la même langue moyenne interne si vous voulez que la plupart de l'optimisation obtiennent la majeure partie de l'optimisation. Ensuite, cette langue moyenne générique est transformée en assembleur pour la cible spécifique, et des optimisations spécifiques ciblées se produisent. Donc, la langue peut ou non induire plus de code de l'avant au milieu lorsque les langues diffèrent grandement, mais pour C / C ++, je suppose que c'est la même ou très similaire. Maintenant, la taille binaire est une autre histoire, les bibliothèques qui peuvent être aspirées dans le binaire pour C seulement vs c ++ même s'il s'agit uniquement de la syntaxe C peut / va varier. Cela n'a pas nécessairement affecter les performances d'exécution, mais peut encombrer les différences de stockage de stockage et de transfert, ainsi que des exigences de la mémoire si le programme est chargé de temps en RAM. Ici encore, il suffit de mesurer. p>
J'ajoute également au commentaire de mesure compilé à assembler et / ou à démonter la sortie et à comparer les résultats de vos différentes langues / choix de compilateur. Cela peut compléter / compléter les différences de synchronisation que vous voyez lorsque vous mesurez. P>
La question a été répondu à la mort, donc je ne l'ajouterai pas. P>
simplement comme une question générique, en supposant que vous avez mesuré, etc., et vous avez identifié qu'un certain segment de code C ++ (ou autre) ne fonctionne pas à une vitesse optimale (ce qui signifie généralement que vous n'avez pas utilisé le bon outil pour le travail. ); Et vous savez que vous pouvez obtenir une meilleure performance en l'écrivant en C, puis oui, définitivement, cela en vaut la peine. P>
Il y a un certain état d'esprit qui est courant, essayant de tout faire d'un outil (Java ou SQL ou C ++). Pas seulement le marteau de Maslow, mais la croyance réelle qu'il peut coder une construction C en Java, etc. Cela conduit à toutes sortes de problèmes de performance. L'architecture, comme une véritable profession, consiste à placer des segments de code dans l'emplacement architectural ou la plate-forme appropriée. C'est la combinaison correcte de Java, SQL et C qui fournira des performances. Qui produit une application qui n'a pas besoin d'être ré-visitée; exécution sans incident. Dans ce cas, cela ne comportera pas si ou lorsque C ++ implémente ces constructeurs ou cela. P>
Je me demande si cela vaut toujours avec les compilateurs modernes et leurs optimisations pour écrire un code critique en C au lieu de C ++ pour la rendre plus rapide. P> blockQuote>
non. Gardez-le lisible. Si votre équipe préfère C ++ ou C, préférez que, surtout s'il fonctionne déjà dans le code de production (ne le réécrivez pas sans très bonnes raisons). P>
Je sais que C ++ pourrait entraîner une mauvaise performance dans les classes de cas en cas de copie alors qu'ils pouvaient être adoptés par référence p> blockQuote>
puis interdire la copie et l'attribution p>
ou lorsque les classes sont créées automatiquement par le compilateur, généralement avec des opérateurs surchargés et de nombreux autres cas similaires P> blockQuote>
Pourriez-vous élaborer? Si vous parlez de modèles, ils n'ont pas de coût supplémentaire dans l'exécution (bien qu'ils puissent conduire à des symboles supplémentaires exportés, ce qui entraîne un binaire plus grand). En fait, l'utilisation d'une méthode de modèle peut améliorer les performances si (par exemple) une conversion serait autrement nécessaire. P>
Mais pour un bon développeur C ++ qui sait éviter tout cela, vaut-il toujours la peine d'écrire du code dans C pour améliorer les performances? P> blockQuote>
Dans mon expérience, un développeur expert C ++ peut créer un programme plus rapide et plus sécurisé. P>
Vous devez être sélectif sur les fonctionnalités de langue que vous utilisez (et n'utilisez pas). Si vous cassez des fonctionnalités C ++ jusqu'à l'ensemble disponible dans C (par exemple, supprimer des exceptions, des appels de fonction virtuelle, RTTI), alors vous êtes parti correctement. Si vous apprenez à utiliser des modèles, des métaprogramming, des techniques d'optimisation, évitez les aliasing de type (qui devient de plus en plus difficile ou verbeux en C), etc., vous devriez alors être à côté ou plus rapide que C - avec un programme plus facile à maintenir (puisque vous sont familiers avec C ++). P>
Si vous êtes à l'aise en utilisant les fonctionnalités de C ++, utilisez C ++. Il possède de nombreuses caractéristiques (dont beaucoup ont été ajoutées avec la vitesse / la coût à l'esprit) et peuvent être écrits aussi vite que C (ou plus rapide). P>
avec des modèles et des métaprogrammages, vous pouvez em> pour transformer de nombreuses variables d'exécution en constantes de la compilation pour des gains exceptionnels. Parfois, cela va bien dans le territoire de micro-optimisation. P>
Que voulez-vous dire par "C"? Vous voulez simplement dire éviter les fonctionnalités C ++ telles que les fonctions STL et virtuelles? Vous pouvez éviter les hits de performance comme une valeur de réussite simplement en utilisant le passage par référence; Rien à voir avec C vs. C ++!
Je veux dire retourner à la programmation de style C et compiler avec un compilateur C au lieu d'un compilateur C ++. J'ai entendu et j'ai lu plusieurs fois cela rendrait le code plus rapide, même si vous n'utilisez pas les fonctionnalités C ++ que vous avez mentionnées.
Personnellement, je n'ai pas remarqué que l'assemblage semble être identique.
@Benoit: Compilation Code C avec un compilateur C ++ (en supposant qu'il est toujours valide C ++) devrait donner des résultats très identiques.
Comme le dit Knuth, "optimisation prématurée est la racine de tout mal".
Si vous êtes contraint à ces extrémités, vous avez de gros problèmes.
Si vous êtes prêt à échanger de la productivité pour des gains de performances incrémentielles hypothétiques, pourquoi ne pas tout coder dans la langue d'assemblage?
"critique" est subjectif, exposer sur ce que vous pensez "critique" signifie
@chrisaycock: Êtes-vous donné aux sources erronées?
@Steve Townsend: "Performance incrémentielle hypothétique" est que ce qui se passe à chaque fois que quelqu'un de programme à assemblage ou est-ce ce qui vous arrive?
@chrisaycock: Knuth n'a pas dit ça. Eh bien, il a fait dire i> cela, mais il a également dit d'autres choses sur l'optimisation des performances qui rendent le sens de cette citation entièrement i> différente.