Question

Je prévois de participer à l'élaboration d'un code écrit en langage C pour l'analyse Monte Carlo des problèmes complexes. Ce code alloue d'énormes tableaux de données en mémoire pour accélérer ses performances, donc l'auteur du code a choisi C au lieu de C ++ prétendant que l'on peut rendre plus rapides et plus fiables (concernant les fuites de mémoire) code avec C.

Avez-vous d'accord avec cela? Quel serait votre choix, si vous avez besoin pour stocker 4-16 Go de tableaux de données dans la mémoire lors du calcul?

Était-ce utile?

La solution

Certainement C ++. Par défaut, il n'y a pas de différence significative entre les deux, et C ++ fournit un certain nombre de choses C ne fait pas:

  1. constructeurs / destructeurs. Ceux-ci vous permettent d'automatiser la plupart gestion de la mémoire, l'amélioration de la fiabilité.
  2. par classe allocataires. Ceux-ci vous permettent d'optimiser l'allocation basée sur la façon dont certains objets sont conçus et / ou utilisés. Cela peut être particulièrement utile si vous avez besoin d'un grand nombre de petits objets (pour donner un exemple évident).

La ligne de fond est que, à cet égard, C fournit absolument aucune possibilité d'un avantage sur C ++. Dans le pire cas, vous pouvez faire exactement les mêmes choses de la même façon.

Autres conseils

Il y a une caractéristique de C99 qui est absent de C ++ et qui donne potentiellement des gains de vitesse importants dans le code de numéro crissement lourd, et qui est mot-clé restrict. Si vous pouvez utiliser un compilateur C ++ qui prend en charge, alors vous avez un outil supplémentaire dans le kit en matière d'optimisation. Il est seulement un gain potentiel, cependant: inline suffisante peut permettre aux mêmes optimisations que restrict et plus encore. Il n'a rien à voir avec l'allocation de mémoire.

Si l'auteur du code peut démontrer une différence de performance entre le code C et C ++ l'attribution d'un tableau 4-16GB, puis (a) Je suis surpris, mais ça va, il y a une différence, et (b) combien fois est le programme va affecter ces grands tableaux? Votre programme va effectivement passer une quantité importante de son temps l'allocation de mémoire, ou est-il passe la plupart de son temps Accès mémoire et faire des calculs? Il faut beaucoup de temps pour réellement faire quoi que ce soit avec un réseau de 4 Go, par rapport au temps qu'il a fallu allouer, et cela signifie que vous devriez être inquiet au sujet de la performance de « rien », et non la performance de l'allocation . Sprinters soins beaucoup la rapidité avec laquelle ils descendent les blocs. Les coureurs de marathon, pas tellement.

Vous devez également faire attention à la façon dont vous référence. Vous devriez être comparer par exemple malloc(size) contre new char[size]. Si vous testez malloc(size) contre new char[size]() alors il est une comparaison injuste puisque celui-ci définit la mémoire à 0 et non le premier. Comparer à la place calloc, mais il faut noter aussi que malloc et calloc sont tous deux disponibles à partir de C ++ dans le cas (peu probable) qu'ils ne prouvent plus rapidement mesurable.

En fin de compte, bien que, si l'auteur est « propriétaire » ou a commencé le projet, et préfère écrire en C plutôt que C ++, il ne devrait pas justifier cette décision avec les allégations de performance probablement-faux, il doit le justifier en disant " Je préfère C, et que ce que je suis en utilisant ». Habituellement, lorsque quelqu'un fait une demande comme celui-ci sur les performances de la langue, et il se trouve sur les essais de ne pas être vrai, vous découvrez que les performances ne sont pas la vraie raison de la préférence linguistique. Prouver la fausse réclamation ne causera pas réellement l'auteur de ce projet soudainement commencer à aimer C ++.

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 », tels que les pointeurs virtuels et ainsi de suite, si vous avez choisi d'avoir des méthodes virtuelles sur vos objets. Mais l'attribution d'un tableau de caractères est tout aussi cher en C comme en C ++, en fait, ils sont probablement à la fois en utilisant malloc pour le faire. En termes de performance, C ++ appelle un constructeur pour chaque objet dans le tableau. Notez que cela se fait que s'il y a un, le constructeur par défaut ne fait rien et est optimisé loin.

Tant que vous préallocation pools de données, afin d'éviter la fragmentation de la mémoire, vous devriez être bon d'aller. Si vous avez POD-struct simples sans méthodes virtuelles, et sans les constructeurs, il n'y a pas de différence.

La seule chose en défaveur de C ++ est sa complexité supplémentaire - combinez cela avec un programmeur qui l'utilise correctement, et vous pouvez facilement ralentir notamment. L'utilisation d'un compilateur C ++ sans les fonctionnalités de C vous donnera les mêmes performances. C ++ en utilisant correctement, vous avez des posisbilities pour être plus rapide.

La langue n'est pas votre problème , allocation et traversant de grands tableaux est.

La principale erreur fatale que vous pourriez faire dans l'allocation (dans les deux langues) alloue 16G de la mémoire, l'initialisation à zéro, pour le remplir avec des valeurs réelles plus tard.

Les plus de gains de performance que je vous attendriez d'optimisations algorithmiques qui permettent d'améliorer localité de référence.

En fonction du système d'exploitation sous-jacente, vous pouvez également affecter la mise en cache des algorithmes - par exemple indiquant qu'une gamme de memroy est traitée séquentiellement seulement.

Pour l'allocation des données brutes, il ne devrait pas y avoir une différence entre C et C ++ sur la plupart des systèmes qu'ils utilisent normalement à la fois les mêmes mécanismes de bibliothèque d'exécution. Je me demande si c'était l'écueil de référence classique où ils ont également mesuré la durée des appels du constructeur en C ++ et commodément oublièrent y compris l'exécution d'une sorte de code d'initialisation en C.

En outre, le « plus fiable (en ce qui concerne les fuites de mémoire) » argument ne tient pas d'eau si vous utilisez RAII en C ++ (comme vous devriez). A moins que quelqu'un fait référence à ce qui en fait une fuite plus fiable, en utilisant RAII, pointeurs intelligents et les classes de conteneurs réduiront le risque de fuites, pas l'augmenter.

Mes principales préoccupations de mémoire qui alloue serait double:

  • Si vous obtenez près de la limite de mémoire physique sur les machines que vous exécutez la simulation Monte Carlo, c'est une bonne façon de diminuer les performances, car le disque pourrait bien commencer à thrash lorsque le système de mémoire virtuelle doit commencer pagination beaucoup. La mémoire virtuelle est pas « libre », même si beaucoup de gens pensent qu'il est.
  • mise en page des données doit être évaluée avec soin afin de maximiser l'utilisation du cache du processeur, sinon vous perdez en partie les avantages de conserver les données dans la mémoire principale en premier lieu.

Si l'allocation de mémoire est un goulot d'étranglement dans ce code, je suggère plutôt redessiner, pas le langage changeant d'allocation plus rapide. Si vous allouez de la mémoire une fois, puis effectuer beaucoup de calculs, je pense ces calculs à un goulot d'étranglement. Si le coût de l'allocation est importante, quelque chose ne tourne pas rond.

Vous pouvez utiliser la famille C des fonctions d'allocation de mémoire en C ++ aussi: à la fois le standard et malloc free, realloc pour agrandir / Shring tableaux et alloca à allouer de la mémoire sur la pile

.

Si vous allez avec new, il attribuera plus de mémoire que nécessaire (surtout pendant le débogage) et effectuer des contrôles supplémentaires pour la cohérence. Il appellera également constructeur pour les classes. Dans un communiqué (-O3) construire la différence sera négligeable pour la plupart des applications.

Maintenant que new apporte que malloc ne l'est new en place. Vous pouvez preallocate un tampon, puis utiliser le new en place pour mettre votre structure dans ce tampon, rendant ainsi « allocation » il instantanée.

Dans l'ensemble, je ne resterais pas loin de C en raison des problèmes de performance. Si quoi que ce soit, votre code sera plus efficace parce que les classes passent le pointeur de this dans les registres au lieu des paramètres comme dans l'équivalent C. Une vraie raison de rester loin de C est la taille du moteur d'exécution C ++. Si vous développez des programmes pour les programmes systèmes embarqués ou chargés démarrage, vous ne pouvez pas intégrer le ~ runtime 4MB. Pour les applications normales, ce ne sera pas cependant, faire une différence.

Si vous devez stocker 4-16 Go de tableaux de données en mémoire pendant le calcul et votre machine ne dispose que de 2 Go de mémoire physique, alors quoi?

Que faire si votre machine a 16 Go de mémoire physique? Est-ce que le système d'exploitation prenne pas de mémoire physique?

Le système d'exploitation vous permettent même d'un espace d'adressage de 4 Go, 16 Go, etc?

Je suggère que, si la performance est une contrainte de mise en œuvre primaire, puis de comprendre comment les plates-formes, qui sont destinés à être utilisés, la fonction et effectuer sont beaucoup plus importantes que la question de toute différence de performance mesurable entre C et C ++ donné des environnements identiques et les algorithmes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top