2008-09-10 9 views
6

¿Normalmente configura su compilador para optimizar la velocidad máxima o el tamaño de código más pequeño? o ¿configura manualmente las configuraciones de optimización individuales? ¿Por qué?¿Cómo se configura normalmente la configuración de optimización de su compilador?

La mayoría de las veces, la gente tiende a dejar la configuración de optimización del compilador en su estado predeterminado, que con la velocidad visual de C++ significa velocidad máxima. Siempre he pensado que la configuración predeterminada tenía más que ver con verse bien en benchmarks, que suelen ser pequeños programas que se ajustan por completo a la caché L2 que lo que es mejor para el rendimiento general, por lo que normalmente lo configuro para el tamaño más pequeño .

Respuesta

6

Como usuario de Gentoo, he intentado bastantes optimizaciones en el sistema operativo completo y ha habido un interminable debate sobre el Gentoo forums al respecto. Algunas buenas banderas para GCC se pueden encontrar en el wiki.

En resumen, la optimización para el tamaño funcionó mejor en una computadora portátil Pentium3 vieja con memoria RAM limitada, pero en mi máquina de escritorio principal con Core2Duo, -O2 dio mejores resultados sobre todos.

También hay un small script si está interesado en los indicadores específicos de x86 (32 bits) que son los más optimizados.

Si usa gcc y realmente desea optimizar una aplicación específica, intente ACOVEA. Ejecuta un conjunto de puntos de referencia y luego los vuelve a compilar con todas las combinaciones posibles de indicadores de compilación. Hay un ejemplo que utiliza la codificación Huffman en el sitio (menos es mejor):

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) 

(Tenga en cuenta que se encontró -Os ser el más lento en este sistema Opteron.)

+1

La primera frase de tu respuesta me recuerda a http://web.archive.org/web/20041230075641/http://www.funroll-loops.org/ –

0

Siempre utilizamos maximizar para una velocidad óptima, pero luego, todo el código que escribo en C++ está relacionado de alguna manera con los algoritmos bioinformáticos y la velocidad es crucial, mientras que el tamaño del código es relativamente pequeño.

0

La memoria es barata ahora días :) Por lo tanto, puede ser útil establecer la configuración del compilador a la velocidad máxima a menos que trabaje con sistemas integrados. Por supuesto, la respuesta depende de la situación concreta.

1

Para mí depende de la plataforma que estoy usando. En el caso de algunas plataformas integradas o cuando trabajé en el procesador Cell, tiene restricciones como una caché muy pequeña o un espacio mínimo para el código.

Uso GCC y suelo dejarlo en "-O2", que es el nivel de optimización "más seguro" y favorece la velocidad en un tamaño mínimo.

Diría que probablemente no suponga una gran diferencia a menos que esté desarrollando una aplicación de muy alto rendimiento, en cuyo caso probablemente deba comparar las diferentes opciones para su caso de uso particular.

2

Yo prefiero usar un tamaño mínimo. La memoria puede ser barata, el caché no es.

+3

¿Y compruebas que produce código más rápido? –

+0

a menos que se encuentre en una situación crítica de memoria, optimizar el tamaño a menudo le dará un peor rendimiento –

1

Microsoft envía todo su software C/C++ optimizado para el tamaño. Después de la evaluación comparativa, descubrieron que, en realidad, da una mejor velocidad (debido a la ubicación de la memoria caché).

2

Además del hecho de que la localidad de caché importa (como dijo On Freund), otra cosa que Microsoft hace es perfilar su aplicación y descubrir qué rutas de código se ejecutan durante los primeros segundos de inicio. Después de eso, vuelven a enviar estos datos al compilador y le piden que coloque juntas las partes que se ejecutan durante el inicio. Esto da como resultado un tiempo de inicio más rápido.

Creo que esta técnica está disponible públicamente en VS, pero no estoy 100% seguro.

1

Hay muchos tipos de optimización, la velocidad máxima versus el código pequeño es solo uno. En este caso, elegiría la velocidad máxima, ya que el ejecutable será un poco más grande. Por otro lado, podría optimizar su aplicación para un tipo específico de procesador. En algunos casos, esta es una buena idea (si tiene la intención de ejecutar el programa solo en su estación), pero en este caso es probable que el programa no funcione en otra arquitectura (p. Ej .: compila su programa para trabajar en un Pentium 4 máquina -> probablemente no funcione en un Pentium 3).

1

Cree ambos, perfil, elija cuál funciona mejor en un proyecto y hardware específico.

Para código de rendimiento crítico, es decir, de lo contrario, elija cualquiera y no se moleste.

0

Esto depende de la aplicación de su programa. Al programar una aplicación para controlar un proceso industrial rápido, optimizar la velocidad tendría sentido. Cuando se programa una aplicación que solo necesita reaccionar ante la entrada de un usuario, la optimización del tamaño podría tener sentido. Es decir, si le preocupa el tamaño de su ejecutable.

0

Ajustar la configuración del compilador de esa manera es una optimización. Con el principio de que "la optimización prematura es la raíz de todo mal", no me molesto hasta que el programa esté cerca de su estado de envío final y descubrí que no es lo suficientemente rápido, es decir, casi nunca.

Cuestiones relacionadas