2009-03-17 13 views
11

Veo esta bandera mucho en los archivos makefiles. ¿Qué significa y cuándo debería usarse?Significado de gcc -O2

+0

@cdonner: Fue downvoted porque él está haciendo preguntas de las páginas del manual de gcc. Tal vez a propósito? –

+1

Este tipo está haciendo demasiadas preguntas que puede obtener las respuestas a sí mismo muy fácilmente. ¿Cada google los documentos para GCC? –

+0

Totalmente de acuerdo con Brian. La gente debería probar man y google antes de publicar tales preguntas. – qrdl

Respuesta

33

El nivel de optimización 2.

Desde la página del GCC:

-O1 Optimizar. La optimización de la compilación lleva algo más de tiempo, y mucho más más memoria para una función grande.

-O2 Optimizar aún más. GCC realiza casi todas las optimizaciones compatibles que no implican una compensación de velocidad de espacio . El compilador no realiza el desenrollado de bucle o la función en línea cuando especifica -O2. Como en comparación con -O, esta opción aumenta tanto el tiempo de compilación como el del código generado.

-O3 Optimiza aún más. -O3 activa todas las optimizaciones especificadas por -O2 y y activa las funciones -finline, -funswitch-loops, -fpredictive-commoning, -fgcse-after-reload y -ftree-vectorize options.

-O0 Reduzca el tiempo de compilación y haga que la depuración produzca los resultados esperados. Este es el predeterminado.

-Os Optimizar para 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.

3

Este es un interruptor de optimización. Ver gcc --help.

12

El nivel de optimización 2, el máximo es 3. Ver: http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

Tenga en cuenta, que en pocos años atrás -O3 podría causar algunos problemas por exceso "optimizar" el código. AFAIK, eso ya no es verdad con las versiones modernas de GCC. Pero con la inercia, -O2 se considera "la máxima seguridad".

1

Los compiladores pueden usar varias técnicas de optimización como el desenrollado de bucles, las optimizaciones de la CPU para encontrar códigos inútiles y evitar riesgos de datos para acelerar su código. Por ejemplo, un ciclo que ocurre una cantidad fija de veces se convertirá en código contiguo sin la sobrecarga de control de ciclo. O si todas las iteraciones de bucle son independientes, es posible la paralelización de algunos códigos.

Establecer el nivel de optimización en 2 indica la cantidad de energía que debe gastar el compilador para buscar esas optimizaciones. Los valores posibles van de 1 a 3

Usted puede aprender más acerca de lo que el compilador puede hacer para optimizar su código: http://en.wikipedia.org/wiki/Compiler_optimization

2

página de manual intentado?

-O2

Optimizar aún más. GCC realiza casi todas las optimizaciones compatibles con que no implican una compensación de velocidad de espacio. El compilador no realiza el desenrollado del bucle o la función en línea cuando especifica -O2.En comparación con -O, esta opción aumenta el tiempo de compilación y el rendimiento del código generado.

En palabras humanas: es la forma verdaderamente seguro más alto de optimización. -O3 realiza reorganizaciones que a veces pueden ser problemáticas. El sujeto como tal es bastante profundo.

1

Sin ninguna opción de optimización, el objetivo del compilador es reducir el costo de compilación y hacer que la depuración produzca los resultados esperados. Al activar la optimización, el compilador intenta mejorar el rendimiento y/o el tamaño del código a expensas del tiempo de compilación y posiblemente la capacidad de depurar el programa.

El valor predeterminado es optimización desactivada. Esto da como resultado el tiempo de compilación más rápido, pero el compilador no hace absolutamente ningún intento de optimización, y los programas generados son considerablemente más grandes y más lentos que cuando la optimización está habilitada. Hay varios -O modificadores (los formularios permitidos son -O0, -O1 -O2, -O3 y -Os) en gcc para controlar el nivel de optimización:

-O0 Sin optimización; genera código no optimizado pero tiene el tiempo de compilación más rápido. Esto es predeterminado.

-O1 Optimización moderada; optimiza razonablemente bien, pero no degrada significativamente el tiempo de compilación. Se necesita mucha más memoria para una función grande.

-O2 GCC realiza casi todas las optimizaciones compatibles que no implican un compromiso espacio-velocidad. El compilador no realiza el desenrollado bucle o función línea cuando se especifica

-O3 optimización completa como en O2; también usa una inclusión automática más agresiva de subprogramas dentro de una unidad e intenta vectorizar bucles. También activa las opciones -finline-functions, -funswitch-loops, -fpredictive-commoning, -fgcse-after-reload y -ftree-vectorize.

-Os Optimizar para 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.

Para obtener más información sobre banderas/opciones que se utilizan en los distintos niveles de optimización y sus detalles: http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html