Question

Configurez-vous normalement votre compilateur pour qu'il optimise la vitesse maximale ou la plus petite taille de code ?ou configurez-vous manuellement les paramètres d'optimisation individuels ?Pourquoi?

Je remarque que la plupart du temps, les gens ont tendance à laisser les paramètres d'optimisation du compilateur à leur état par défaut, ce qui, avec Visual C++, signifie une vitesse maximale.J'ai toujours pensé que les paramètres par défaut avaient plus à voir avec l'apparence sur les benchmarks, qui ont tendance à être de petits programmes qui s'intègrent entièrement dans le cache L2 que ce qui est le mieux pour les performances globales, donc je les optimise normalement pour la plus petite taille.

Était-ce utile?

La solution

En tant qu'utilisateur Gentoo, j'ai essayé pas mal d'optimisations sur le système d'exploitation complet et il y a eu des discussions sans fin sur le Forums Gentoo à ce sujet.Quelques bons indicateurs pour GCC peuvent être trouvés dans le wiki.

En bref, l'optimisation de la taille a mieux fonctionné sur un ancien ordinateur portable Pentium3 avec une RAM limitée, mais sur mon ordinateur de bureau principal avec un Core2Duo, -O2 a donné de meilleurs résultats dans l'ensemble.

Il y a aussi un petit script si vous êtes intéressé par les indicateurs spécifiques x86 (32 bits) les plus optimisés.

Si vous utilisez gcc et souhaitez vraiment optimiser une application spécifique, essayez ACOVEA.Il exécute un ensemble de tests, puis les recompile avec toutes les combinaisons possibles d'indicateurs de compilation.Il y a un exemple utilisant l'encodage Huffman sur le site (le plus bas est le mieux) :

A relative graph of fitnesses:

   Acovea Best-of-the-Best: **************************************                (2.55366)
     Acovea Common Options: *******************************************           (2.86788)
                       -O1: **********************************************        (3.0752)
                       -O2: ***********************************************       (3.12343)
                       -O3: ***********************************************       (3.1277)
           -O3 -ffast-math: **************************************************    (3.31539)
                       -Os: *************************************************     (3.30573)

(Notez qu'il a trouvé que -Os était le plus lent sur ce système Opteron.)

Autres conseils

Je préfère utiliser une taille minimale.La mémoire est peut-être bon marché, le cache n'est pas.

Outre le fait que la localité du cache est importante (comme l'a dit On Freund), Microsoft fait également le profil de son application et découvre quels chemins de code sont exécutés pendant les premières secondes du démarrage.Après cela, ils renvoient ces données au compilateur et lui demandent de rapprocher les parties exécutées au démarrage.Cela se traduit par un temps de démarrage plus rapide.

Je crois que cette technique est disponible publiquement dans VS, mais je n'en suis pas sûr à 100 %.

Pour moi, cela dépend de la plateforme que j'utilise.Pour certaines plates-formes embarquées ou lorsque j'ai travaillé sur le processeur Cell, vous avez des contraintes telles qu'un très petit cache ou un espace minimal prévu pour le code.

J'utilise GCC et j'ai tendance à le laisser sur "-O2", qui est le niveau d'optimisation "le plus sûr" et privilégie la vitesse par rapport à une taille minimale.

Je dirais que cela ne fait probablement pas une énorme différence, sauf si vous développez pour une application très performante, auquel cas vous devriez probablement comparer les différentes options pour votre cas d'utilisation particulier.

Microsoft livre tous ses logiciels C/C++ optimisés en termes de taille.Après une analyse comparative, ils ont découvert que cela donnait en réalité une meilleure vitesse (en raison de la localité du cache).

Il existe de nombreux types d'optimisation, la vitesse maximale par rapport au petit code n'en est qu'un.Dans ce cas, je choisirais la vitesse maximale, car l'exécutable sera juste un peu plus gros.D'un autre côté, vous pourriez optimiser votre application pour un type spécifique de processeur.Dans certains cas, c'est une bonne idée (si vous comptez exécuter le programme uniquement sur votre station), mais dans ce cas il est probable que le programme ne fonctionnera pas sur une autre architecture (ex :vous compilez votre programme pour qu'il fonctionne sur une machine Pentium 4 -> il ne fonctionnera probablement pas sur un Pentium 3).

Créez les deux, profilez, choisissez celui qui fonctionne le mieux sur un projet et un matériel spécifiques.

Pour le code critique en termes de performances, sinon, choisissez-en un et ne vous embêtez pas.

Nous utilisons toujours maximiser pour une vitesse optimale, mais ensuite, tout le code que j'écris en C++ est en quelque sorte lié aux algorithmes bioinformatiques et la vitesse est cruciale alors que la taille du code est relativement petite.

La mémoire est bon marché de nos jours :) Il peut donc être utile de définir les paramètres du compilateur à la vitesse maximale, sauf si vous travaillez avec des systèmes embarqués.Bien entendu, la réponse dépend de la situation concrète.

Cela dépend de l'application de votre programme.Lors de la programmation d’une application destinée à contrôler un processus industriel rapide, il serait logique d’optimiser la vitesse.Lors de la programmation d'une application qui doit uniquement réagir aux entrées d'un utilisateur, l'optimisation de la taille peut avoir du sens.Autrement dit, si vous êtes préoccupé par la taille de votre exécutable.

Modifier les paramètres du compilateur comme celui-ci est une optimisation.Partant du principe selon lequel « l'optimisation prématurée est la racine de tous les maux », je ne m'en soucie pas jusqu'à ce que le programme soit proche de son état de livraison final et que j'ai découvert qu'il n'est pas assez rapide - c'est-à-direpresque jamais.

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