Question Combien dois-je optimiser?


En ce qui concerne les optimisations effectuées par le compilateur (GCC), quelle est la pratique standard? Qu'est-ce que chaque option (-O, -O1, -O2, -O3, -Os, -s, -fexpensive-optimizations) fait différemment et comment décider de ce qui est optimal?


11
2018-06-07 01:24


origine


Réponses:


Habituellement, -O2 est un bon niveau d'optimisation à essayer en premier.

Cependant, si vous souhaitez obtenir le meilleur résultat possible, vous finirez par essayer de nombreux niveaux d’optimisation, car vous ne pourrez pas déterminer à l’avance quel niveau sera le mieux adapté à votre application.

Prenez également note que les résultats de l'optimisation doivent varier avec chaque CPU (sur certains processeurs, l'optimisation de la taille peut en fait donner une meilleure vitesse que l'optimisation de la vitesse).

Juste pour référence future, voici une brève description de chaque niveau (vous pouvez trouver la description complète dans la documentation http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html):

-O (identique à -O1): Avec -O, le compilateur essaie de réduire la taille du code et le temps d'exécution, sans effectuer aucune optimisation nécessitant beaucoup de temps de compilation.

-O2: optimise encore plus. GCC exécute presque toutes les optimisations prises en charge qui n'impliquent pas de compromis en termes de vitesse spatiale. Par rapport à -O, cette option augmente à la fois le temps de compilation et les performances du code généré.

-O3: optimise encore plus. -O3 active toutes les optimisations spécifiées par -O2 et active également -finline-functions, -funswitch-loops, -fpredictive-commoning, -fgcse-after-reload, -ftree-vectorize, -ftree-partial-pre et - options fipa-cp-clone.

-Os: Optimiser pour la taille. -Os active toutes les optimisations -O2 qui n'augmentent généralement pas la taille du code. Il effectue également d'autres optimisations conçues pour réduire la taille du code.

-Ofast: Ne pas respecter les normes strictes. -Ofast active toutes les optimisations -O3. Il permet également des optimisations qui ne sont pas valables pour tous les programmes conformes aux normes. Il active -ffast-math et les -fno-protect-parens et -fstack-arrays spécifiques à Fortran. Si vous utilisez plusieurs options -O, avec ou sans numéros de niveau, la dernière option est celle qui est efficace.


8
2018-06-07 01:49



Le noyau Linux Makefile prévoit à la fois -O2 et -Os. L'un ou l'autre serait approprié sans plus de détails.

le -Os optimise pour le petit stockage. Étant donné que les processeurs sont beaucoup plus rapides que la mémoire principale, l’optimisation pour un stockage réduit prend tout son sens, même sur des machines énormes - tout le temps passé à attendre que le cache soit rempli depuis la mémoire principale est temps perdu. Donc, tirer le meilleur parti du cache d'instructions en compilant l'efficacité de l'espace et peut-être le temps d'exécution sera aussi améliorer.

le -O2 exécute toutes les "optimisations habituelles", et les optimisations choisies seront sûres. (J'ai entendu dire que certains des -O3 les optimisations ne sont pas toujours sûres, mais cela peut être dû au fait que le noyau Linux s'exécute avec des contraintes qui ne sont pas communes aux applications habituelles.)

le meilleur La réponse, bien sûr, est de compiler votre logiciel avec plusieurs niveaux d’optimisation; combien de temps il faut pour compiler le logiciel et combien de temps il faut au logiciel pour exécuter des tests de référence représentatifs. Mesurer la quantité de mémoire utilisée pour tous.

Ensuite, choisissez la "meilleure" combinaison de vitesse de compilation, de vitesse d'exécution et d'utilisation de la mémoire d'exécution. Vous voudrez peut-être les compilations les plus rapides ou vous voudrez peut-être les temps d'exécution les plus rapides, ou vous pouvez essayer d'insérer une quantité moindre de mémoire d'un fournisseur d'hébergement virtuel pour économiser de l'argent.

C'est probablement juste de choisir juste -O2 sans faire aucune mesure.


2
2018-06-07 01:36