c++ - telefonicas - codigo pais telefono
Recomendaciones y opciones de GCC para el código más rápido (7)
Estoy distribuyendo un programa en C ++ con un makefile para la versión Unix, y me pregunto qué opciones de compilador debo usar para obtener el código más rápido posible (cae en la categoría de programas que pueden usar toda la potencia de cómputo que pueden obtener). y aún vuelvo por más), dado que no sé de antemano qué hardware, sistema operativo o versión de gcc tendrá el usuario, y quiero, por encima de todo, asegurarme de que al menos funcione correctamente en todas las principales funciones de Unix. sistema operativo.
Hasta ahora, tengo g++ -O3 -Wno-write-strings
, ¿hay alguna otra opción que deba agregar? En Windows, el compilador de Microsoft tiene opciones para cosas como la convención de llamadas rápidas y la generación de código de tiempo de enlace que vale la pena usar, ¿hay algún equivalente en gcc?
(Supongo que el valor predeterminado será de 64 bits en una plataforma de 64 bits, corríjame si ese no es el caso).
- rápido
Por favor intente -oFast en lugar de -o3
También aquí hay una lista de banderas que puede habilitar selectivamente.
-tienda flotante
-exceso-precisión = estilo
matemáticas
-fno-redondeo-matemáticas
-fno-señalización-nans
-fcx-rango limitado
-fno-math-errno
-funsafe-math-optimizations
-asociativo-matematicas
-freciprocal-math
-finita-solo-matematica
ceros no firmados
-fno-trampeo-matematicas
Matemáticas
-completo-precisión-constante
-fcx-fortran-rules
Una lista completa de las banderas y su descripción detallada está disponible aquí.
Considere usar -fomit-frame-pointer
menos que necesite depurar con gdb (yuck). Eso le dará al compilador un registro más para usar para las variables (de lo contrario, este registro se desperdicia para los punteros de marco inútiles).
También puede usar algo como -march=core2
o, más generalmente, -march=native
para permitir que el compilador use instrucciones más nuevas y sintonizar aún más el código para la arquitectura especificada, pero para esto debe estar seguro de que no se esperará que se ejecute su código en procesadores antiguos.
No hay ''fastcall'' en x86-64; tanto Win64 como Linux ABI definen las llamadas basadas en registros ("fastcall") como la única convención de llamadas (aunque Linux utiliza más registros).
No se garantiza que gcc -O3 sea el más rápido. -O2 es a menudo un mejor punto de partida. Después de eso, perfile la optimización guiada y pruebe opciones específicas: http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
Es una lectura larga, pero probablemente vale la pena.
Tenga en cuenta que una "Generación de código de tiempo de enlace" (MSVC) también conocida como "Optimización de tiempo de enlace" está disponible en gcc 4.5+
Por cierto, no hay una convención de llamada específica "llamada rápida" para Win64. Solo existe la convención de llamada "the": http://msdn.microsoft.com/en-us/magazine/cc300794.aspx
Probaría la optimización guiada de perfil:
-fprofile-generate
Habilita las opciones que normalmente se usan para la aplicación de instrumentación para producir un perfil útil para la recompilación posterior con la optimización basada en la retroalimentación del perfil. Debe usar-fprofile-generate
tanto al compilar como al vincular su programa. Las siguientes opciones están habilitadas:-fprofile-arcs
,-fprofile-values
,-fvpt
.
También debe dar al compilador sugerencias sobre la arquitectura en la que se ejecutará el programa. Por ejemplo, si solo se ejecutará en un servidor y puede compilarlo en la misma máquina que el servidor, puede usar -march=native
. De lo contrario, debe determinar qué características tendrán todos sus usuarios y pasar el parámetro correspondiente a GCC.
(Aparentemente, estás apuntando a 64 bits, por lo que GCC probablemente ya incluirá más optimizaciones que para x86 genérico).
Sin duda, aparte de lo que otros ya han sugerido, intente -flto
. Permite la optimización del tiempo de enlace que, en algunos casos, puede hacer magia.
Para obtener más información, consulte gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
Sin saber nada específico sobre tu programa es difícil de decir. O3 cubre la mayoría de las optimizaciones. Las opciones restantes vienen "a un costo". Si puede tolerar un redondeo aleatorio y su código no depende de los estándares de punto flotante IEEE, entonces puede probar -Oast. Esto no tiene en cuenta el cumplimiento de las normas y puede darle un código más rápido
Las marcas de optimización restantes solo pueden mejorar el rendimiento de ciertos programas, pero incluso pueden ser perjudiciales para otros. Mire los indicadores disponibles en la documentación de gcc en los indicadores de optimización y evalúelos.
Otra opción es habilitar C99 (-std = c99) y las funciones apropiadas en línea. Esto es un poco de un arte, no debería incluirlo todo, pero con un poco de trabajo puede hacer que su código sea más rápido (aunque a costa de tener un ejecutable más grande).
Si la velocidad es realmente un problema, sugeriría volver al compilador de Microsoft o probar los de Intel. He llegado a apreciar lo lento que puede ser un código compilado con gcc, especialmente cuando se trata de math.h.
EDIT: Oh, espera, dijiste C ++? Luego ignora mi párrafo C99, ya puedes en línea :)