2009-05-20 10 views
10

Si uso el indicador "-O2", el rendimiento mejora, pero el tiempo de compilación se alarga.Cuándo usar la bandera -O2 para gcc?

¿Cómo puedo decidir si usarlo o no?

¿Quizás O2 hace la mayor diferencia en algunos tipos de código (por ejemplo, cálculos matemáticos?), Y ¿debería usarlo solo para esas partes del proyecto?

EDITAR: Quiero enfatizar el hecho de que establecer -O2 para todos los componentes de mi proyecto cambia el tiempo de compilación total de 10 minutos a 30 minutos.

+2

Esto no responde a su pregunta, pero en función de su edición, parece que necesita cambiar la forma en que está construyendo su proyecto. Después de su compilación inicial, solo debería compilar fuentes modificadas para .o y luego vincular los archivos .o. – cyberconte

+0

Los archivos de encabezado precompilados también pueden ayudar a generar rendimiento. –

Respuesta

23

Yo recomendaría el uso de O2 mayor parte del tiempo, los beneficios incluyen:

  • reduce lo general de tamaño código generado (a diferencia de -O3).
  • Más advertencias (algunas advertencias requieren un análisis que solo se lleva a cabo durante la optimización)
  • A menudo, el rendimiento es medible y mejorado (lo que puede no importar).

Si el código del nivel de lanzamiento tendrá la optimización habilitada, es mejor tener la optimización habilitada durante todo el ciclo de desarrollo/prueba.

La depuración a nivel de fuente es más difícil con las optimizaciones habilitadas, de vez en cuando es útil deshabilitar la optimización al depurar un problema.

+1

Si necesita reducir el tamaño del código, ¿por qué no utiliza -Os en lugar de -O2? – Christoffer

+3

Usar -Os tiene sentido si el tamaño del código es lo más importante para optimizar, generalmente no lo es (excepto en pequeños sistemas integrados ...) –

+0

He visto más de una vez compiladores cuando se les dice que optimicen para tamaño hacen binarios más grandes que cuando se le dijo que optimizara la velocidad. Siempre uso -O2, a veces -O3 pero tomo los riesgos que lo acompañan. –

5

Siempre, excepto cuando está programando y solo quiere probar algo que acaba de escribir.

11

Estoy en bioinformática, por lo que mi consejo puede ser parcial. Dicho esto, I siempre utilice el -O3 conmutador (para compilaciones de versión y prueba, es decir, no suele ser para la depuración). Es cierto que tiene ciertas desventajas, como aumentar el tiempo de compilación y, a menudo, el tamaño del ejecutable.

Sin embargo, el primer factor puede ser mitigado parcialmente por una buena estrategia de compilación y otros trucos que reducen el tiempo total de compilación. Además, dado que la mayoría de la compilación está realmente vinculada a E/S, el aumento del tiempo de compilación a menudo no es que se pronunció.

La segunda desventaja, el tamaño del ejecutable, a menudo simplemente no importa en absoluto.

+1

Exactamente: estructurar su compilación correctamente y prestar atención a las dependencias en sus archivos make usualmente hace que el tiempo de compilación no sea un problema. Por lo general, lo mismo ayuda con el tamaño del archivo ejecutable, aunque he visto personas que hacen cosas muy estúpidas que resultan en programas enormes. –

+0

Me gusta esta respuesta, pero agregaría la advertencia de que debería ser fácil de ejecutar sin optimización ya que GDB funciona mucho mejor de esa manera. – dicroce

+1

Según mi experiencia, el tiempo de compilación es "fácil" de arreglar en comparación con el tiempo de enlace. (Tiempo para buscar preguntas sobre "reducción del tiempo de enlace") – leander

6

Nunca.

Uso -O3 -Wall -Werror -std = [cualquiera que sea su base de código debe seguir]

+1

Como experimento, construí LAME con -O3 y con -Os, excepto que usé -O3 para algunos archivos seleccionados manualmente después del perfilado. La versión en su mayoría en O fue en realidad un 10% más rápida. El conmutador de optimización no es un dial mágico de rendimiento, pero si lo dejamos con un máximo de 11 puede hacer que su ejecutable sea más grande, dificultar la depuración e introducir errores relacionados con la optimización. – LnxPrgr3

3

Por lo general, hemos fijado nuestro entorno acumulación de modo que podemos construir versiones de depuración que el uso -O0 y versión se basa que utilizan -O3 (el entorno de construcción conserva los objetos y las bibliotecas de todas las configuraciones, de modo que uno puede cambiar fácilmente entre configuraciones). Durante el desarrollo, uno construye y ejecuta principalmente la configuración de depuración para una velocidad de compilación más rápida (y una información de depuración más precisa) y con menor frecuencia también crea y prueba la configuración de lanzamiento.

2

¿Es realmente el tiempo de compilación aumentado notable? Uso -O2 todo el tiempo como predeterminado, cualquier cosa menos deja una gran "fricción" en tu código. También tenga en cuenta que los niveles de optimización de -O1, -O2 tienden a ser los mejor probados, ya que son los más interesantes.-O0 tiende a ser más problemático, y puedes depurar bastante bien en -O2 en mi experiencia. Siempre que tenga alguna idea acerca de lo que un compilador puede hacer en términos de reordenación de código, alineación, etc.

-Werror -Wall es necesario.

+0

Bueno, de alguna manera establecer -O2 para todos los componentes de mi proyecto cambia el tiempo de compilación total de 10 minutos a 30 minutos –

+0

de 10 minutos a 30 minutos. Eso duele lo suficiente como para evitarlo. Punto a favor. – jakobengblom2

Cuestiones relacionadas