Pregunta

¿Normalmente configura su compilador para optimizar la velocidad máxima o el tamaño de código más pequeño?¿O configuras manualmente los ajustes de optimización individuales?¿Por qué?

Noto que la mayoría de las veces la gente tiende a dejar la configuración de optimización del compilador en su estado predeterminado, lo que con Visual C++ significa velocidad máxima.Siempre he sentido que la configuración predeterminada tenía más que ver con verse bien en los puntos de referencia, que tienden a ser programas pequeños que caben completamente dentro del caché L2 que con lo que es mejor para el rendimiento general, por lo que normalmente lo configuro para optimizarlo para el tamaño más pequeño.

¿Fue útil?

Solución

Como usuario de Gentoo, he probado bastantes optimizaciones en todo el sistema operativo y ha habido interminables discusiones sobre las Foros de Gentoo al respecto.Algunas buenas banderas para GCC se pueden encontrar en el wiki.

En resumen, la optimización del tamaño funcionó mejor en una vieja computadora portátil Pentium3 con RAM limitada, pero en mi computadora de escritorio principal con un Core2Duo, -O2 dio mejores resultados en general.

También hay un guión pequeño 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 (cuanto más bajo, 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 encontró que -Os es el más lento en este sistema Opteron).

Otros consejos

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

Además del hecho de que la localidad de la caché es importante (como dijo On Freund), otra cosa que hace Microsoft es perfilar su aplicación y descubrir qué rutas de código se ejecutan durante los primeros segundos del inicio.Después de eso, envían estos datos al compilador y le piden que acerque 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.

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

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

Yo diría que probablemente no haga una gran diferencia a menos que esté desarrollando una aplicación de muy alto rendimiento, en cuyo caso probablemente debería comparar las distintas opciones para su caso de uso particular.

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

Hay muchos tipos de optimización, velocidad máxima versus 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ías optimizar tu aplicación para un tipo específico de procesador.En algunos casos esto es una buena idea (si desea ejecutar el programa sólo en su estación), pero en este caso es probable que el programa no funcione en otra arquitectura (por ejemplo:compila su programa para que funcione en una máquina Pentium 4 -> probablemente no funcionará en una Pentium 3).

Cree ambos perfiles y elija cuál funciona mejor en un proyecto y hardware específicos.

Es decir, para código de rendimiento crítico; de lo contrario, elija cualquiera y no se moleste.

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

La memoria es barata hoy en día :) Por lo tanto, puede ser significativo 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.

Esto depende de la aplicación de su programa.Al programar una aplicación para controlar un proceso industrial rápido, tendría sentido optimizar la velocidad.Al programar una aplicación que sólo necesita reaccionar a 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.

Modificar la configuración del compilador de esa manera es una optimización.Según el principio de que "la optimización prematura es la raíz de todos los males", no me molesto hasta que el programa está cerca de su estado final de envío y descubro que no es lo suficientemente rápido, es decir,casi nunca.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top