2012-06-07 17 views
11

Con respecto a las optimizaciones hechas por el compilador (GCC), ¿cuál es la práctica estándar? ¿Qué hace cada opción (-O, -O1, -O2, -O3, -Os, -s, -fexpensive-optimizations) de forma diferente, y cómo puedo decidir qué es lo óptimo?¿Cuánto debo optimizar?

+0

http://stackoverflow.com/questions/19689014/gcc-difference-between-o3-and-os || http://stackoverflow.com/questions/11546075/is-optimisation-level-o3-dangerous-in-g –

Respuesta

8

Generalmente -O2 es un buen nivel de optimización para probar primero.

Sin embargo, si quiere el mejor resultado posible, terminará probando muchos niveles de optimización ya que no puede decir de antemano qué nivel será el mejor para su aplicación.

Además, tenga en cuenta que los resultados de optimización deberían variar con cada CPU (en algunas CPU que optimizan el tamaño, en realidad podría ofrecer una velocidad mejor que la optimización de la velocidad).

Sólo para referencia futura, he aquí una breve descripción de cada nivel (se puede encontrar la descripción completa en la documentación http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html):

-O (idéntica a -O1): Con -O, los intentos del compilador para reducir el tamaño del código y el tiempo de ejecución, sin realizar ninguna optimización que requiera una gran cantidad de tiempo de compilación.

-O2: Optimiza aún más. GCC realiza casi todas las optimizaciones admitidas que no implican una compensación de velocidad de espacio. En comparación con -O, esta opción aumenta el tiempo de compilación y el rendimiento del código generado.

-O3: Optimice aún más. -O3 activa todas las optimizaciones especificadas por -O2 y también activa las funciones -finline, -funswitch-loops, -fpredictive-commoning, -fgcse-after-reload, -ftree-vectorize, -ftree-partial-pre y - Opciones de fipa-cp-clone.

-Os: optimizar el tamaño.-Os habilita todas las optimizaciones de -O2 que normalmente no aumentan el tamaño del código. También realiza optimizaciones adicionales diseñadas para reducir el tamaño del código.

-Después: no respete el cumplimiento estricto de las normas. -Ofast habilita todas las optimizaciones de -O3. También permite optimizaciones que no son válidas para todos los programas compatibles. Enciende -funciones matemáticas y Fortran -fno-protect-parens y -fstack-arrays. Si usa varias opciones -O, con o sin números de nivel, la última opción es la que es efectiva.

+0

Gracias, especialmente por ese enlace. Muy útil. –

2

El kernel de Linux Makefile proporciona tanto -O2 como -Os. Cualquiera de los dos sería apropiado sin más detalles.

El -Os optimiza para el almacenamiento pequeño. Dado que las CPU son significativamente más rápidas que la memoria principal en estos días, la optimización para un almacenamiento pequeño tiene sentido incluso en máquinas grandes: el tiempo dedicado a esperar que la memoria caché se llene desde la memoria principal es tiempo perdido. Así que aproveche al máximo la caché de instrucciones compilando por la eficiencia del espacio y quizás el tiempo de ejecución también mejore .

El -O2 ejecuta todas las "optimizaciones habituales" y las optimizaciones elegidas serán seguras. (He oído que algunas de las optimizaciones -O3 no siempre son seguros, pero que puede ser debido a que el núcleo de Linux se ejecuta con algunas limitaciones que no son comunes a las aplicaciones habituales.)

El mejor respuesta, por supuesto, es compilar su software con múltiples niveles de optimización; el tiempo que lleva compilar el software y el tiempo que demora el software para ejecutar las pruebas representativas de referencia. Mida cuánta memoria se usa para todos ellos.

A continuación, seleccione la "mejor" combinación de velocidad de compilación, velocidad de ejecución y uso de la memoria de tiempo de ejecución. Es posible que desee obtener las compilaciones más rápidas o que desee los tiempos de ejecución más rápidos, o puede que intente encajar en una cantidad menor de memoria de un proveedor de alojamiento virtual para ahorrar dinero.

Probablemente sea justo elegir -O2 sin hacer ninguna medición.