Je prévois de participer au développement d'un code écrit en C pour l'analyse de Monte Carlo de problèmes complexes. Ces codes allouent d'énormes matrices de données en mémoire pour accélérer ses performances. L'auteur du code a donc choisi C au lieu de C ++ affirmant que l'on peut apporter un code plus rapide et plus fiable (concernant des fuites de mémoire) avec c. P>
Êtes-vous d'accord avec ça? Quel serait votre choix si vous devez stocker 4-16 Go de tableaux de données en mémoire pendant le calcul? P>
8 Réponses :
Il n'y a pas de différence réelle entre C et C ++ en termes d'allocation de mémoire. C ++ a plus de données "cachées", telles que des pointeurs virtuels, etc., si vous avez choisi d'avoir des méthodes virtuelles sur vos objets. Mais allouer une gamme de caractères est aussi coûteux en C comme en C ++, en fait, ils utilisent probablement à Malloc pour le faire. En termes de performances, C ++ appelle un constructeur pour chaque objet dans la matrice. Notez que cela ne se fait que s'il en existe un, le constructeur par défaut ne fait rien et est optimisé. P>
Tant que vous prévenez des piscines de données, pour éviter la fragmentation de la mémoire, vous devriez être prêt à partir. Si vous avez des structures de pod simples sans méthodes virtuelles, et sans constructeurs, il n'y a pas de différence. P>
"En fait, ils utilisent tous les deux malloc pour le faire" juste être un pédant, mais ce n'est pas nécessairement vrai; Nouveau code> /
Supprimer code> Ne devez pas utiliser
MALLOC code> et
GRATUIT code> par défaut.
@Gman; Bien sûr que non, il devrait y avoir un «probablement» là-bas. G ++ le fait par défaut je pense. C n'a pas à l'utiliser non plus. :)
Pour g ++ / gcc, les deux nouveaux code> et
malloc code> appelent finalement
brk code>
@Dan andreatta: Seulement sur les systèmes Linux.
@Stephen Canon: Bien sûr, à droite, et seulement lorsqu'ils ont finalement besoin d'un nouveau pool de mémoire forment le système d'exploitation.
définitivement C ++. Par défaut, il n'y a pas de différence significative entre les deux, mais em> c ++ fournit deux choses celles non: p>
Le résultat final est que, à cet égard, c ne fournit absolument aucune possibilité d'avantage sur C ++. Dans le pire des cas, vous pouvez faire exactement les mêmes choses de la même manière. P>
Les constructeurs / destructeurs sont parfois une mauvaise chose, cependant, la performance sage, et c'est peut-être facile à manquer.
@roe: obtenir une performance maximale de l'une ou l'autre nécessite des soins - mais une CTOR et DTOR sont finalement simplement un moyen d'emballage des mêmes opérations que vous faites dans C. La seule différence est qu'ils rendent la gestion suffisamment facile pour que vous soyez souvent tenté d'utiliser les quand vous ne le considéreriez pas même dans C.
ER, si vous utilisez des constructeurs et des destructeurs, C ++ définitivement i> est plus lent, simplement parce qu'il doit allouer et i> initialiser.
@paxdiablo: Désolé, mais c'est un non-sens complet. Un CTOR peut faire autant ou i> comme peu d'initialisation que vous le souhaitez. Spécifiquement, vous l'utiliserez (normalement) pour faire exactement la même initialisation que vous le feriez dans C, auquel cas il n'est pas plus lent (mais en raison des autres facteurs susmentionnés, il peut encore être plus rapide).
@paxdiablo: Sûrement, si vous devez initialiser, vous devez initialiser si c'est dans un constructeur ou via un bloc de code ailleurs. Si vous avez besoin de mémoire initialisée, vous devez allouer et i> initialiser. Si vous n'avez pas besoin d'initialiser, vous n'avez pas besoin d'un constructeur déclaré par l'utilisateur et que la mise en œuvre peut optimiser son généré à rien.
@paxdiablo: Vous pouvez choisir de ne pas avoir de constructeur / destructeur dans votre classe. La performance ne s'appuie pas sur la manière dont la fonctionnalité C ++ fonctionne, mais sur la manière dont vous êtes (ou ne les utilisez pas) en fonction de vos besoins.
Malentendu, Jerry. Je pensais que votre commentaire "définitivement c ++" était de faire avec la performance alors que, sur une lecture, je peux voir que vous vouliez dire que c'est celui que vous choisiriez. Excuses.
@paxdiablo: C'est ce que je choisirais en fonction des critères cités de performance et de fiabilité. C ++ ne définitivement i> a un avantage dans la performance, mais dans le pire des cas, il peut donner exactement la même performance, et environ 90% du temps qu'il aura au moins un léger avantage.
... et la fiabilité est beaucoup mieux en C ++. Même si vous utilisez uniquement le sous-ensemble C de C ++, vous pouvez déposer dans quelques objets RAII pour aider à gérer les fuites de mémoire dans des fonctions complexes (retours multiples, raccourcis d'erreur potentiels ...) et le code sera plus fiable.
Vous pouvez utiliser la famille de la famille des fonctions d'allocation de mémoire en C ++. TO STANDARD Si vous allez avec MAINTENANT QUELLE Dans l'ensemble, je ne resterais pas loin de c en raison de problèmes de performance. Si quelque chose, votre code sera plus efficace, car les classes passent le bouton MALLOC CODE> et
GRATUIT CODE>,
REALLOC CODE> Agrandir / Shring RABES ET
ALLOCA CODE> Pour allouer la mémoire sur la pile. P>
Nouveau code>, il allouera plus de mémoire que nécessaire (principalement pendant le débogage) et effectuera des contrôles supplémentaires pour la cohérence. Il appellera également le constructeur pour les cours. Dans une version (
-O3 code>) construire la différence sera négligeable pour la plupart des applications. P>
NOUVEAU code> apporte que MALLOC n'est pas le nouveau
Nouveau code>. Vous pouvez prélever une mémoire tampon puis utiliser le nouveau
neuf code> pour mettre votre structure dans ce tampon, ce qui rend ainsi "alloué" informatique instantané. P>
ce pointeur code> dans des registres au lieu de paramètres comme dans l'équivalent C. Une vraie raison de rester à l'écart de C est la taille du temps d'exécution C ++. Si vous développez des programmes pour des systèmes intégrés ou des programmes chargés de démarrage, vous ne pouvez pas intégrer le temps d'exécution ~ 4 Mo. Pour des applications normales toutefois, cela ne fera pas la différence. P>
Pour allouer des données brutes, il ne devrait pas y avoir une différence entre C et C ++ sur la plupart des systèmes, car ils utilisent normalement les mêmes mécanismes de bibliothèque d'exécution. Je me demande si c'était la piège de référence classique où ils ont également mesuré le temps d'exécution des appels de constructeur en C ++ et oublié de manière appropriée, y compris l'exécution de tout type d'initialisation en c. P>
Aussi, l'argument "plus fiable (concernant les fuites de mémoire)" ne contient aucune eau si vous utilisez Raii en C ++ (comme vous le souhaitez). À moins que quelqu'un se réfère à la rendant plus fiabilité de manière plus fiable, utiliser Raii, les pointeurs intelligents et les classes de conteneurs réduiront le potentiel de fuites, ne l'augmente pas. P>
Mes principales préoccupations concernant l'affectation de ce que la mémoire serait double: p>
Si l'allocation de la mémoire est un goulot d'étranglement dans ce code, je suggérerais plutôt de redéfinir, sans changer de langue pour une allocation plus rapide. Si vous allouez une mémoire une fois de mémoire, puis effectuez de nombreux calculs, je m'attendrais à ce que ces calculs soient un goulot d'étranglement. Si le coût de l'allocation est significatif, quelque chose ne va pas ici. P>
Si vous devez stocker 4-16 Go de tableaux de données en mémoire pendant le calcul et que votre machine n'a que 2 Go de mémoire physique, alors quoi? P>
Et si votre machine a 16 Go de mémoire physique? Le système d'exploitation prend-il sans mémoire physique? P>
Le système d'exploitation vous permet-il même un espace d'adressage de 4 Go, 16 Go, etc. p>
Je suggère que, si la performance est une contrainte de mise en œuvre primaire, alors comprenez comment les plates-formes, destinées à être utilisées, fonctionner et effectuer sont beaucoup plus importantes que la question de toute différence de performance mesurable entre les environnements identiques C et C ++ donnés. et algorithmes. P>
Il existe une fonctionnalité de C99 qui est absente de C ++ et offre potentiellement des gains de vitesse importants dans un code de chiffrement élevé, et c'est le mot-clé Si l'auteur du code peut démontrer une différence de performance entre C et C ++ Code attribuant un réseau de 4-16 Go, puis (a) Je suis surpris, mais d'accord, il y a une différence, et (b) combien de Times em> est le programme allouer pour allouer de tels tableaux importants? Votre programme va-t-il réellement dépenser une quantité importante de son temps allouant de temps, ou est-ce qu'il dépense la plupart de son temps accéder à la mémoire em> et à faire des calculs? Il faut beaucoup de temps à faire em> tout avec un tableau de 4 Go, comparé au temps qu'il a fallu pour allouer, et cela signifie que vous devriez vous inquiéter de la performance de "quoi que ce soit", et non la performance de l'allocation . Les sprinters se soucient beaucoup de la rapidité des blocs. Coureurs de marathon, pas tellement. P>
Vous devez également faire attention à votre référence. Vous devriez comparer par exemple En fin de compte, si l'auteur "possède" ou a démarré le projet, et préfère écrire en C plutôt que c ++, il ne devrait donc pas justifier cette décision avec des revendications de performance probablement parasites, il devrait justifier en disant " Je préfère C, et c'est ce que j'utilise ". Habituellement, lorsque quelqu'un fait une réclamation comme celle-ci sur la performance linguistique, et il s'avère testé pour ne pas être vrai, vous découvrez que la performance n'est pas la vraie raison de la préférence de la langue. Prouvage La réclamation Faux ne fera pas réellement que l'auteur de ce projet commence soudainement à aimer C ++. P> restreindre code>. Si vous pouvez utiliser un compilateur C ++ qui le supporte, vous avez un outil supplémentaire dans le kit lorsqu'il s'agit d'optimiser. Ce n'est qu'un gain potentiel, bien que: l'affranchissement suffisant peut permettre les mêmes optimisations que
restreindre code> et plus encore. Il n'a également rien à voir avec la répartition de la mémoire. P>
malloc (taille) code> contre
nouveau caractère [taille] code>. Si vous testez
malloc (taille) code> contre
nouveau caractère [Taille] () code> C'est une comparaison injuste car ce dernier définit la mémoire à 0 et le premier ne le fait pas. Comparer contre
calloc code> à la place, mais également notez que
malloc code> et
calloc code> sont tous deux disponibles de C ++ dans l'événement (peu probable) qu'ils prouvent de manière mesurable plus vite . p>
La seule chose en disfavaçage de C ++ est une complexité supplémentaire forte> - Combinez qu'avec un programmeur qui l'utilise de manière incorrecte et vous pouvez facilement ralentir de manière notable. L'utilisation d'un compilateur C ++ sans fonctionnalités C ++ vous donnera la même performance. En utilisant C ++ correctement, vous avez des possibles pour être plus rapides. P>
La langue n'est pas votre problème forte>, alloué et traverser de grandes matrices de grande taille. p>
La principale erreur mortelle que vous pourriez faire en allocation (dans l'une ou l'autre langue) alloue 16 g de mémoire, l'initialisation à zéro, uniquement pour le remplir avec des valeurs réelles plus tard. P>
Les gains les plus performants que j'attends des optimisations algorithmiques qui améliorent la localité de référence. p>
Selon le système d'exploitation sous-jacent, vous pouvez également affecter les algorithmes de mise en cache - par exemple. indiquant qu'une plage de mémoires n'est traitée que séquentiellement. P>
Je ne pense pas que l'allocation de 16 Go apportera une performance. L'espace affecte le temps aussi.
Une grande partie de la fiabilité vient de l'expérience. Même si C ++ est plus fiable que c pour la gestion des ressources (le Raii aide beaucoup là-bas), un programmeur C expérimenté peut trouver plus facilement (et faire des erreurs moins) impliquant-le en C et en C ++. La fiabilité vient du programmeur et non de la langue (la langue peut aider ou gêner, mais la partie principale est le programmeur)